fstream qui pète un plomb ?

fstream qui pète un plomb ? - C++ - Programmation

Marsh Posté le 27-11-2010 à 22:31:31    

Bonsoir \o/
 
Bon, voilà, j'ai un drôle de problème avec la libraire fstream, mon fichier se découpe comme ça (animation pour un jeu) sign(x),pos(x),sign(y),pos(y),frame_index,xscale,yscale,layer.
Lorsque je lis toute ces valeurs avec mon code, bah au bout de la 9ème frame il pète un plomb (frame_index a rien à voir avec la frame de l'animation), voilà mon code :  
 

Code :
  1. double open_animation(char* file)
  2. {
  3.     int filesize;
  4.     int framecount;
  5.     int i;
  6.     unsigned short temp_xabs;
  7.     unsigned short temp_yabs;
  8.     int temp_x;
  9.     int temp_y;
  10.     int binpos;
  11.     unsigned char temp_sign;
  12.     char temp_xscale;
  13.     char temp_yscale;
  14.     unsigned short temp_frame_index;
  15.     unsigned char temp_layer;
  16.     ifstream f(file,ios::binary);
  17.     if (!f.is_open()) cerr << "!!";
  18.     f.seekg(0,ios::end);
  19.     filesize = f.tellg();
  20.     framecount = (filesize/11)-10;
  21.     f.seekg(0,ios::beg);
  22.     resize(framecount);
  23.       i=0;
  24.       binpos=0;
  25.       while (binpos<filesize-1)
  26.     {
  27.       //  f.seekg(binpos);
  28.         f.read((char*) &temp_sign,1);
  29.         binpos+=1;
  30.         f.seekg(binpos);
  31.         f.read((char*) &temp_xabs,2);
  32.         if (temp_sign==255) {temp_x = temp_xabs*-1;}
  33.         if (temp_sign==0)  {temp_x = temp_xabs;}
  34.         //END OF X POS
  35.         // YPOS
  36.         binpos+=2;
  37.         f.seekg(binpos);
  38.         f.read((char*) &temp_sign,1);
  39.         binpos+=1;
  40.         f.seekg(binpos);
  41.         f.read((char*) &temp_yabs,2);
  42.         if (temp_sign==255) {temp_y = temp_yabs*-1;}
  43.         if (temp_sign==0)  {temp_y = temp_yabs;}
  44.         //END OF Y POS
  45.         // Frame index !
  46.         binpos+=2;
  47.         f.seekg(binpos);
  48.         f.read((char*) &temp_frame_index,2);
  49.         // End of frame index
  50.         //xscale !
  51.         binpos+=2;
  52.         f.seekg(binpos);
  53.         f.read((char*) &temp_sign,1);
  54.         if (temp_sign==255) {temp_xscale = -1;}
  55.         if (temp_sign==0)  {temp_xscale =  1;}
  56.         // end of xscale
  57.         //yscale !
  58.         binpos+=1;
  59.         f.seekg(binpos);
  60.         f.read((char*) &temp_sign,1);
  61.         if (temp_sign==255) {temp_yscale = -1;}
  62.         if (temp_sign==0)  {temp_yscale =  1;}
  63.         // end of yscale
  64.         //layer !
  65.         binpos+=1;
  66.         f.seekg(binpos);
  67.         f.read((char*) &temp_layer,1);
  68.         // end of layer
  69.         // FILL THE ARRAY !
  70.         set_value(i,temp_x,temp_y,temp_frame_index,temp_xscale,temp_yscale,temp_layer);
  71.         binpos+=1;
  72.         f.seekg(binpos);
  73.         i++;
  74.         }
  75.     f.close();


 
on dirait qu'il se décale progressivement, en gros au lieu de lire 05 00 (les bytes sont inversé, donc en dec ça fait 5), il me lit 00 05 (1280 en dec)
 
D'où viens mon problème ? :(
 
Merci d'votre aide et @++ :D


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 27-11-2010 à 22:31:31   

Reply

Marsh Posté le 27-11-2010 à 23:31:16    

char[2] ne fait pas forcément un short, ça dépend des architectures or c'est que tu sous-entends avec le read(&xxx,2). ça peut venir de là...

 

Perso, l'utilisation massive de seekg ne me plait gère (ainsi que les binpos+=xxx).

 

Pourquoi ne fais-tu pas plutôt l'utilisation de >>, c'est fait pour non ?
Par exemple (j'ai pas testé)

Code :
  1. //Read of temp_x
  2. f >> temp_sign >> temp_xabs;
  3. temp_x = (temp_sign==0)?(temp_xabs):(-temp_xabs);
  4. //Read of temp_y
  5. f >> temp_sign >> temp_yabs;
  6. temp_y = (temp_sign==0)?(temp_yabs):(-temp_yabs);
  7. //Read of temp_frame index
  8. f >> temp_frame_index;
  9. //Read of xscale
  10. f >> temp_sign;
  11. temp_xscale = (temp_sign==0)?(1):(-1);
  12. //Read of yscale
  13. f >> temp_sign;
  14. temp_yscale = (temp_sign==0)?(1):(-1);
  15. //Read of layer
  16. f >> temp_layer;
  17. //Set values and move forward in the table
  18. set_value(i,temp_x,temp_y,temp_frame_index,temp_xscale,temp_yscale,temp_layer);
  19. ++i;
 

Message cité 1 fois
Message édité par dreameddeath le 27-11-2010 à 23:42:59
Reply

Marsh Posté le 28-11-2010 à 11:34:30    

dreameddeath a écrit :

char[2] ne fait pas forcément un short, ça dépend des architectures or c'est que tu sous-entends avec le read(&xxx,2). ça peut venir de là...
 
Perso, l'utilisation massive de seekg ne me plait gère (ainsi que les binpos+=xxx).
 
Pourquoi ne fais-tu pas plutôt l'utilisation de >>, c'est fait pour non ?
Par exemple (j'ai pas testé)

Code :
  1. //Read of temp_x
  2. f >> temp_sign >> temp_xabs;
  3. temp_x = (temp_sign==0)?(temp_xabs):(-temp_xabs);
  4. //Read of temp_y
  5. f >> temp_sign >> temp_yabs;
  6. temp_y = (temp_sign==0)?(temp_yabs):(-temp_yabs);
  7. //Read of temp_frame index
  8. f >> temp_frame_index;
  9. //Read of xscale
  10. f >> temp_sign;
  11. temp_xscale = (temp_sign==0)?(1):(-1);
  12. //Read of yscale
  13. f >> temp_sign;
  14. temp_yscale = (temp_sign==0)?(1):(-1);
  15. //Read of layer
  16. f >> temp_layer;
  17. //Set values and move forward in the table
  18. set_value(i,temp_x,temp_y,temp_frame_index,temp_xscale,temp_yscale,temp_layer);
  19. ++i;


 


Le code a pas marché :(
 
la structure de mon fichier est comme ça : signx(1B) 255 pour -1 et 0 pour 1 ; posx(2B) unsigned short ;  signy(1B) 255 pour -1 et 0 pour 1 ; posy(2B) unsigned short ; frame_index(2B) unsigned short ; xscale(1B) 255 pour -1 et 0 pour 1 ; yscale(1B) 255 pour -1 et 0 pour 1 ; layer (1B) unsigned char
 
Comment j'peux adapter ton code ? j'comprends pas trop :D  


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 28-11-2010 à 16:18:27    

Ok, bon, c'était mon fichier qui était bidon :D

 

Donc maintenant ça marche niquel, et maintenant faut que je fasse passer une adresse, je m'explique :

 

ma DLL charge les données d'un fichier qu'elle stocke dans son tableau (local), j'ai besoin de pouvoir me servir de plein de tableaux, donc je suis sensé faire passer son pointeur pour ensuite récupérer les données dans le bon tableau, c'est ça ? comment je peux retrouver un tableau via une adresse en double ? j'ai lu comme quoi fallait utiliser &lepointeur, mais je sais pas trop..

 

halp !

 

edit : le problème vient de la :

 
Code :
  1. double get_x(double marray,double n)
  2. {
  3.     return(double) (*marray)[n].x;
  4. }


marray est sensé être l'adresse du tableau en double, faut que je fasse quoi pour qu'il la reprenne bien ?


Message édité par Terminapor le 28-11-2010 à 16:55:40

---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 30-11-2010 à 11:56:51    

sauf que marray est un double, et pas un **double.

Reply

Marsh Posté le 02-12-2010 à 22:20:04    

ça marche pas non plus :/
 
jsuis sensé faire quoi ?


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 02-12-2010 à 22:43:21    

double get_x(double* marray,double n)
 
genre un pointeur quoi ...

Reply

Marsh Posté le 04-12-2010 à 21:03:36    

Joel F a écrit :

double get_x(double* marray,double n)
 
genre un pointeur quoi ...


A marche pas non plus :/
 
ça peut venir d'un mauvais export d'array ?
 

Code :
  1. double open_animation(char* file)
  2. {
  3.     vector <animdata> *array;
  4.     array = new vector <animdata>;
  5.     array->resize(framecount);
  6.     // tout mon bordel d'array
  7.     return (int) array;
  8. }


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 05-12-2010 à 11:00:24    

mais pourquoi cast tu ton pointeur en int alors que tu renvoies un double ?
GOTO un livre de C++ là :E

Reply

Marsh Posté le 05-12-2010 à 11:08:44    

Joel F a écrit :

mais pourquoi cast tu ton pointeur en int alors que tu renvoies un double ?
GOTO un livre de C++ là :E


pasqu'après y'a une autre fonction qui le reprend et qui l'exporte en double, sinon j'ai une erreur "pointer value used where a floating point value where expected" :/


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 05-12-2010 à 11:08:44   

Reply

Marsh Posté le 05-12-2010 à 14:41:24    

non mais attends ... tu sais ce qu'est un pointeur au moins ? TU es conscient que tu écris un truc qui n'a aucun sens ?

Reply

Marsh Posté le 05-12-2010 à 14:56:13    

Joel F a écrit :

non mais attends ... tu sais ce qu'est un pointeur au moins ? TU es conscient que tu écris un truc qui n'a aucun sens ?


Bah c'est l'adresse où y'a mon tableau, non ?


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 05-12-2010 à 15:39:22    

ca te choque pas de caster un pointeur de vector en double ?
Au lieu de caster comme un gros porc pour masquer tes erreurs, apprends à lire et réfléchi sur l'effet désiré de ta méthode.

Message cité 1 fois
Message édité par Joel F le 05-12-2010 à 15:39:51
Reply

Marsh Posté le 05-12-2010 à 15:53:06    

Joel F a écrit :

ca te choque pas de caster un pointeur de vector en double ?
Au lieu de caster comme un gros porc pour masquer tes erreurs, apprends à lire et réfléchi sur l'effet désiré de ta méthode.


Oui mais je peux pas faire autrement, je dois récupérer cette valeur en double.


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 05-12-2010 à 16:45:15    

non mais arretes ... réfléchis 10s au lieu d'écrire n'imp.

Reply

Marsh Posté le 05-12-2010 à 17:26:43    

Joel F a écrit :

non mais arretes ... réfléchis 10s au lieu d'écrire n'imp.


Ben, c'est la première fois que je touche au c++, j'suis déjà content d'avoir pu écrire tout ce bordel :sweat:
 
Mais là j'sais vraiment pas comment m'y prendre, j'ai vu des infos sur les '*' et '&' mais j'arrive pas à le faire marcher.. :/


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 05-12-2010 à 18:22:41    

lis un bouquin. Tu joues pas au bingo, tu programmes ...

Reply

Marsh Posté le 11-12-2010 à 17:10:23    

Baah, j'm'en sors pas :sweat:
 
j'ai abandonné l'idée de faire passer des adresses en double, c'est trop crasseux :/
Du coups j'ai tenté de stocker mes tableaux dans un array global, voilà mon code :  
 

Code :
  1. vector <animstruct> *garray;
  2.    unsigned int line;
  3. void array_load (unsigned int n, unsigned int array, unsigned int framecount)
  4. {
  5.     (*garray)[n].anim = array;
  6.     (*garray)[n].framecount = framecount;
  7. }
  8. void set_value(unsigned int array,unsigned int n,int x,int y, unsigned short frame_index,char xscale,char yscale,unsigned char layer)
  9. {
  10.      (*array)[n].x = x;
  11.      (*array)[n].y = y;
  12.      (*array)[n].frame_index = frame_index;
  13.      (*array)[n].xscale = xscale;
  14.      (*array)[n].yscale = yscale;   
  15.      (*array)[n].layer = layer;
  16. }
  17. export double open_animation(char* file)
  18. {
  19. // initialisation des variables
  20.     vector <animdata> *array;
  21.     array = new vector <animdata>;
  22.     garray = new vector <animstruct>;
  23.     array->resize(framecount);
  24.       for (i=0;i<framecount;i++)
  25.     {
  26.      // import des infos à partir du fichier
  27.         set_value(array,i,temp_x,temp_y,temp_frame_index,temp_xscale,temp_yscale,temp_layer); // j'remplis mon tableau
  28.     }
  29.         line++;
  30.         garray->resize(line);
  31.         array_load(line,array,framecount);
  32.         return (line); // vu qu'il faut que je puisse retrouver mon tableau, je renvois la ligne à laquel il est sensé être stocké
  33. }


 
Mais voilà, j'ai cette erreur : "invalid conversion from `std::vector<animdata, std::allocator<animdata> >*' to `unsigned int' " dans la fontion set_value(array,etc) et aussi "invalid type argument of `unary*' sur tout les lignes (*array)[n] d'où vient l'erreur ?


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 12-12-2010 à 19:30:18    

même caca que la dernière fois, tu code sans savoir.
Une adresse n'est pas un entier ni un double. Réfléchi à l'adaptation des tes interfaces de fonctions plutot que de faire n'imp ...
 
Vraiment, relit un bouqin de C.

Reply

Marsh Posté le 19-12-2010 à 19:41:07    

Aah, ben j'ai finalement compris :D
 
Maintenant, j'ai un autre ptit problème :  
 
Mes vecteur sont stocké dans un vecteur global (garray), chacun ont un numéro de ligne, par exemple (*garray)[0].anim (c'est une structure avec un vector<animdata> *anim et un unsigned int framecount) ça sera le premier vecteur.
 
dans ma fonction double get_x(double id,double line) je sais pas comment récupérer le vecteur via un truc du style (*garray)[id].anim, et le membre nommé x de sa structure; en gros je voudrais fabriquer un vecteur appelé 'tarray' qui récupère tout les informations du vecteur n°0 stocké dans garray par exemple
 
 
Merci d'vot aide !


---------------
Perhaps you don't deserve to breathe
Reply

Sujets relatifs:

Leave a Replay

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