Pb avec std::istream::read

Pb avec std::istream::read - C++ - Programmation

Marsh Posté le 21-09-2003 à 21:52:37    

Bonjour,
 
J'ai une classe avec le membre suivant :

Code :
  1. int NbRows;


Dans une fonction membre, j'ai écrit le code suivant :
 

Code :
  1. ifstream Stream;
  2. Stream.read(static_cast<char *>(&this->NbRows), sizeof(int));


 
Je compile avec gcc et j'ai l'erreur suivante :

invalid static_cast from type `int*' to type `char*'


Pourquoi ?
Comment utiliser la fonction read sur mon entier ?


Message édité par Enidan le 21-09-2003 à 21:53:24
Reply

Marsh Posté le 21-09-2003 à 21:52:37   

Reply

Marsh Posté le 21-09-2003 à 21:53:09    

reinterpret_cast ici

Reply

Marsh Posté le 21-09-2003 à 21:55:20    

OK, merci

Reply

Marsh Posté le 21-09-2003 à 21:56:15    

on est d'accord que ce sont des entrées/sorties binaires

Reply

Marsh Posté le 21-09-2003 à 22:00:54    

tout à fait  :)

Reply

Marsh Posté le 21-09-2003 à 22:04:59    

remarques : les conventions veulent que les identificateurs de variables ne commencent pas par des majuscules
 
 
stream.read(static_cast<char *>(&this->NbRows), sizeof this->NbRows);
 
me parait une écriture plus adéquouate et moi source d'erreur, plus flexible aux modifications de code (si tu change le type de NbRows, genre en unsigned long, faut tout refaire)

Reply

Marsh Posté le 21-09-2003 à 22:14:16    

Taz a écrit :

remarques : les conventions veulent que les identificateurs de variables ne commencent pas par des majuscules


J'ai toujours entendu qu'il y avait plusieurs conventions. Est-ce qu'il y en a une qui est la "règle" ? peux-tu me donner le lien ?
 

Taz a écrit :

stream.read(static_cast<char *>(&this->NbRows), sizeof this->NbRows);
 
me parait une écriture plus adéquouate et moi source d'erreur, plus flexible aux modifications de code (si tu change le typede NbRows, genre en unsigned long, faut tout refaire)


C'est vrai, je vais le changer
 
 
Sinon, j'ai cette fois le pb avec la fonction write.
Voici le message d'erreur:

reinterpret_cast from `const int*' to `char*' casts  away const (or volatile)


Or, ma donnée membre n'est pas constante !

Reply

Marsh Posté le 21-09-2003 à 22:17:34    

aucun lien
 
 
mais this doit l'être ! donc faut rajouter un const_cast.

Reply

Marsh Posté le 21-09-2003 à 22:25:11    

Effectivement, ça compile :

Code :
  1. Stream.write(reinterpret_cast<char *>(const_cast<int *>(&this->NbRows)), sizeof(int));


 
C'est parce que la fonction membre où j'utilise le wrtie est déclarée constante, donc this est constant  :p  
 
Merci encore.

Reply

Marsh Posté le 21-09-2003 à 22:26:42    

Citation :

sizeof(int)

 [:taz]

Reply

Marsh Posté le 21-09-2003 à 22:26:42   

Reply

Marsh Posté le 21-09-2003 à 23:22:01    

gloups !

Reply

Marsh Posté le 22-09-2003 à 05:00:34    

je ne comprend pas le code, elle fait quoi cette fonction ?
  :??:

Reply

Marsh Posté le 22-09-2003 à 07:47:20    

xiluoc a écrit :

je ne comprend pas le code, elle fait quoi cette fonction ?
  :??:  

elle fait que tu vas acheter un bouquin

Reply

Marsh Posté le 22-09-2003 à 09:45:51    

Taz a écrit :

elle fait que tu vas acheter un bouquin


 
 
- computer science tapestry (Exploring Programming And Compuer Science with c++)
 
- Schaum's outline Data structures with c++ (j ai bien celui la)
 
    [:dams86]  
 


---------------
jeunes con de la derniere averse, vieux con des neiges d'antant.
Reply

Marsh Posté le 22-09-2003 à 13:06:07    

inconnus au bataillon

Reply

Marsh Posté le 22-09-2003 à 14:59:35    

Y'aurait pas une possibilité d'utiliser un opérateur de flux ( >> )?
 
 
EDIT : Le reste j'ai effacer parce que j'avais mis une grosse clownerie  :lol:


Message édité par namewithn0man le 22-09-2003 à 15:12:54
Reply

Marsh Posté le 22-09-2003 à 15:12:00    

namewithn0man a écrit :

Y'aurait pas une possibilité d'utiliser un opérateur de flux ?

Code :
  1. ifstream << (&this->NbRows);




ce qui écrit un truc du genre 0xdeadbeef, très utile
 

namewithn0man a écrit :

J'avais un pb de cast pour l'écriture dans un fichier (texte cette fois-ci). Je m'en suis sorti avec cet opérateur (le cast est automatique)

:heink:  
 

namewithn0man a écrit :

En plus c'est du vrai code pur C++ ANSI authentique(les méthodes de transtypage sont trop souvent propriétaires (genre itoa( : 100% MS))

meme si itoa existait en C++, je te dirai que ne pas l'utiliser

namewithn0man a écrit :


EDIT : Je me demande si je ne viens pas de poster une grosse clownerie... (en C++ je suis encore au stade du débutage). S'il y a erreur, quelqu'un pourrait corriger svp ? (aussi pour ma culture perso)


il semblerait bien

Reply

Marsh Posté le 22-09-2003 à 15:14:40    

Taz a écrit :


 
il semblerait bien


 
zut quelqu'un est passé par là avant que je me rende compte de mon incompétence en relisant mon post... Braf, quand on sait pas, faut s'écraser et pas faire le malin  :cry:

Reply

Marsh Posté le 22-09-2003 à 15:16:35    

namewithn0man a écrit :


 
zut quelqu'un est passé par là avant que je me rende compte de mon incompétence en relisant mon post... Braf, quand on sait pas, faut s'écraser et pas faire le malin  :cry:  

je l'aurais pas dit comme ça, mais effectivement, quand on sait pas, mieux vaut ouvrir ses yeux, poser des questions et ne pas laisser galoper son esprit de débutant (voir le résultat plus haut  :D )
 
tout est ok ici ?

Reply

Marsh Posté le 22-09-2003 à 15:20:37    

Citation :


 :heink:  


 
et bien si je persiste
 

Code :
  1. outFile << "Contient " << missions.size() << " missions"<< std::endl;


 
sans cast explicite
 
EDIT: et en effet tout est ok. Je croyais avoir une solution, j'ai voulu participer pour une fois - pour rendre service... Jusque là j'ai quasiment toujours trouvé les réponses à mes questions en me promenant sur ce forum, j'ai voulu être fairplay et participer un peu.


Message édité par namewithn0man le 22-09-2003 à 15:25:02
Reply

Marsh Posté le 22-09-2003 à 15:29:11    

Il n'empêche que t'as beau être peut-être bon en C++, mais un pack de battlecruisers y fait pas long feu contre des carriers !  :)  (cf. nos signatures)

Reply

Marsh Posté le 22-09-2003 à 15:30:15    

:heink: ²

Reply

Marsh Posté le 22-09-2003 à 15:40:07    


dans starcraft le battlecruiser il fait "good day commander" quand on cliquette dessus :O
 
(toi ca viendrait pas plutot du all your base are belong to us ?)

Reply

Marsh Posté le 22-09-2003 à 15:43:24    

ça vous est jamais arrivé de vous faire griller d'une minute ?

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed