OVH Cloud OVH Cloud

Passage d'un paramètre par valeur

3 réponses
Avatar
Boris Sargos
Salut à tous,

j'aimerais pouvoir passer dans ma fonction :

void MyFunction(StreamReader reader) {
for(int i=0; i<100; i++) { /*...*/ reader.ReadLine(); }
}

le paramètre par valeur, comme en C++. C'est à-dire que dans le code
suivant :

string myString;
StreamReader reader = new Streamreader(myStream);
for(int i=0; i<10000; i++) myString=reader.ReadLine();
MyFunction(reader);
reader.ReadLine() /*...*/

je souhaite que le reader de la dernière ligne lise la ligne n°10000,
celle sur laquelle il était positionné avant l'appel de la foncion
MyFunction.
Comme il n'existe pas de fonction Clone() pour cette classe
StreamReader, je ne vois pas comment éviter de lire le texte depuis le
tout début.


Si quelqu'un a une idée ...


Merci,
Boris.

3 réponses

Avatar
Ambassadeur Kosh
re

ça fait déja ce que tu veux.
le passage par valeur n'a pas de sens.
ou alors je n'ai rien compris à ta question.

public void f(Stream stream)
{
int i = stream.ReadByte() ;
}


// stream.Position == 0
stream.ReadByte() ;

// stream.Position == 1
f(stream) ;

// et la...
//stream.Position == 2
stream.ReadByte() ;

//stream.Position == 3

c'est pas ce que tu voulais ?

si c'est une copie dont tu as besoin, tu as Peek pour lire un byte en
avance.
sinon, une idée, c'est de remettre Position du baseStream à la valeur ou
elle était en entrant.
ainsi la fonction rend le stream dans l'etat ou il etait en entrant

tu fais de l'analyse syntaxique ?
Avatar
Boris Sargos
En fait, tu parles de Stream et sa position. Moi je parle de
StreamReader. On ne peut pas stocker la position d'un StreamReader.
C'est pour ça que je voulais utiliser le passage par valeur. En gros, ça
revient à faire une copie du contenu de l'objet (et non pas du
pointeur). Ce qui est impossible en C# si l'objet ne possède pas la
méthode Clone(). C'est le truc qui me gêne le plus en C#: travailler sur
de pointeurs sans que ceux-ci soient manipulables comme tels.

Peut-être que la piste que tu me donnes (BaseStrem.Position) va marcher.
Je vais m'y frotter tout de suite.

Oui, je fais de l'analyse syntaxique de manière temporaire sur un type
de page HTML contenant des données que je veux récupérer
automatiquement. C'est assez classique en somme.

Merci pour tes tuyaux, à +
Boris.
Avatar
Ambassadeur Kosh
> En fait, tu parles de Stream et sa position. Moi je parle de
StreamReader.



StreamReader possedant un BaseStream, j'ai rangé les deux dans le meme sac.

C'est pour ça que je voulais utiliser le passage par valeur.


abandonne cette idée

ouvre autant de fois le Stream que tu veux à la position. ou alors, lit le
dans un byte[], et monte autant de Stream sur ce byte [] que tu as besoin,
le Stream devenant un simple curseur...
ce qui revient au meme mais t'affranchit du File

Peut-être que la piste que tu me donnes (BaseStrem.Position) va marcher.
Je vais m'y frotter tout de suite.
Oui, je fais de l'analyse syntaxique de manière temporaire sur un type
de page HTML contenant des données que je veux récupérer
automatiquement. C'est assez classique en somme.



je m'en doutais un peu.
bon normallement, tu as juste besoin de peek. le html se décide trés bien
avec un caractere d'avance.
avec un automate, tu vas pouvoir decouper les tokens au fur et à mesure que
tu avances.
ensuite, tu pourras constituer ton arbre. seulement une fois qu'un element
est lu et construit, la tu le traites.
donc pas besoin de copie

suis la piste que te file Patrick, c'est la bonne (c'est à cet article que
je faisais reference).
la, t'es parti pour te reecrire completement l'affaire, et ça craint :
encodage, commentaires...

A+

--
ps : on se telephone, j'en ai de bonnes à te raconter :)