Un probleme qui me tracassait depuis des lustres... BENB je t'adore :hello:
tgrx
Il apporte pas grand chose c vrai.
C'est juste que j'ai ecrit l'operateur << pour un grand nombre de classes, qui derivent les unes des autres, et je veux etre sur que le compilateur ne fait pas n'importe quoi.
Mais tu as raison je vais essayer sans le cast. :hello:
BENB
Je suis desolee de te repoondre par une question, mais pourquoi :
f<<(Fluid)*this;
et non pas f<<*this; ?
Qu'apporte le Cast Fluid ici ?
Il me semble plus dangereux qu'autre chose...
Est-il necessaire ?
[edit]--Message édité par BENB--[/edit]
tgrx
rufo> ok pour ton explication, mais pourquoi dans ce cas l'operateur << arrive a m'ecrire correctement le contenu de la classe Fluid dans le fichier, et plante uniquement au retour, au 'return out' ?
Si le passage par reference de *this merdait, ca le ferait des le debut non ?
rufo
pour moi, c'est:
f << (Fluid) *this;
qui fait planter. Le passage par référence, c'est très vicieux comme truc. C'est un passage par adresse écrit et manipulé comme un passage par valeur.
Tu devrai essayer ça:
f << (Fluid) this;
tgrx
Je suis oblige de retourner une reference si je veux surcharger l'operateur << (qui consiste a ecrire des donnees dans un flux, fichier pour f, sortie ecran pour cout).
Ce que je ne comprends pas c'est qu'a priori le programme plante au moment du "return out", alors que quand je regarde le fichier ecrit, il est parfaitement correct, la structure s'est parfaitement bien sauvee sur le disque. Le probleme vient du fait qu'il n'arrive pas a effectuer le 'return out'.
C'est franchement :ouch: :(
heffer
"Segmentation fault" c'est un pb d'allocation de mémoire je crois. Mais je comprends pas vraiment ton prog vu qu'il n'y a pas tout. Il fait quoi ton opérateur <<.
Moi j'essayerais de ne pas retouner une référence pour ton opérateur <<.
tgrx
Voici un court extrait de mon programme :
ofstream & operator << (ofstream& out, const Fluid& f)
{
out << f.variables << ... out << f.matrices << ...
out << flush;
cout << "Well done\n";
return out;
}