[C++] petit pb de seg. fault

petit pb de seg. fault [C++] - C++ - Programmation

Marsh Posté le 26-07-2005 à 17:26:38    

Bonjour,
 
je suis sur cette erreur depuis un certain temps et j'ai peur d'avoir perdu tout recul pour la résoudre.
 

Code :
  1. #include "fm_volume.h"
  2. using namespace std;
  3. int main ()
  4. {
  5.   FmVolume* firstVolume = new FmVolume("1exam10_06_02" );
  6.   cout<<"yop"<<endl;
  7.   return 1;
  8. }


 
la classe FmVolume étant définie dans fm_volume.h.
Mon probleme c'est à l'execution : superbe segmentation fault apres "yop" ... :pt1cable:  
Se peut-il qu'il s'agisse d'erreurs de la classe FmVolume qui seraient "descendues" ?
Merci pour vos suggestions...


Message édité par nifnef le 26-07-2005 à 18:17:00
Reply

Marsh Posté le 26-07-2005 à 17:26:38   

Reply

Marsh Posté le 26-07-2005 à 17:31:18    

# #include <cstdlib>
# #include <cstdio>
# #include <string>
# #include <fstream>
 
ça sert à quoi tout ça ?

Reply

Marsh Posté le 26-07-2005 à 17:38:28    

a pas grand chose effectivement...

Reply

Marsh Posté le 26-07-2005 à 18:03:29    

tu ne voudrais pas nous montrer ton code de fm_volume.h/cpp ?

Reply

Marsh Posté le 26-07-2005 à 18:07:08    

mouerf vous allez crier... mais si la seg fault est apres le yop, ca peut venir d'avant?
je vai le chercher...
le .h

Code :
  1. #ifndef __FM_VOLUME_H__
  2. #define __FM_VOLUME_H__
  3. #include <cstdlib>
  4. #include <cstdio>
  5. #include <string>
  6. #include <fstream>
  7. #include <iostream>
  8. #include <gsl/gsl_matrix.h>
  9. #include <gsl/gsl_vector.h>
  10. using namespace std;
  11. const float SIXTEEN_BITS_VALUE = 65535.0;
  12. const float TWELVE_BITS_VALUE_F = 32767.0;
  13. const int TWELVE_BITS_VALUE_I = 32767;
  14. const int HEIGHT_BITS_VALUE = 256;
  15. const int INIT_VALUE = -1;
  16. const string HDR_SUFF = ".hdr";
  17. const string IMG_SUFF = ".img";
  18. class FmVolume
  19. {
  20. private:
  21.   string fm_fname;
  22.   int fm_dims[4];
  23.   double fm_dim[3];
  24.   //gsl_vector* fm_pinfo;
  25.   //gsl_matrix* fm_mat;
  26.   string fm_descrip;
  27.   int fm_n;
  28.   gsl_matrix* fm_data[];
  29.   //fm_private;
  30.   int fm_error;
  31. public:
  32.   FmVolume(string filename);
  33.   ~FmVolume();
  34. private:
  35.   int loadIMG();
  36.   float read_header(FILE *fp_hdr, FILE *fp_img, int plane, int *flag);
  37.   int read_image(FILE *fp_img, unsigned short *data, int plane, int *flag, float scale);
  38. };
  39. #endif /* __FM_VOLUME_H__ */


le .cpp est plutot lourd...


Message édité par nifnef le 27-07-2005 à 15:19:11
Reply

Marsh Posté le 26-07-2005 à 18:10:51    

il y a une (au moins) seg fault dans le cpp mais je l'ai mise en commentaire et celle qui me bloque s'est alors dévoilée
si on peut voir ce qui se passe sans le cpp ca serait cool, il y a environ 400 lignes je me vois mal les poster.

Reply

Marsh Posté le 26-07-2005 à 18:32:18    

c'est quand tu veux pour donner du code ...
 
sinon RTFM, tu lances ton debugger et tu te débrouilles.

Reply

Marsh Posté le 26-07-2005 à 18:42:46    

Voici le cpp (arrangé et tronqué)

Code :
  1. #include "fm_volume.h"
  2. #include "HEADER.h"
  3. using namespace std;
  4. FmVolume::FmVolume(string filename)
  5. {
  6.   fm_fname = filename;
  7.   loadIMG();
  8. }
  9. FmVolume::~FmVolume()
  10. {
  11.   //gsl_vector_free(fm_pinfo); jamais alloué pour l'instant
  12.   //gsl_matrix_free(fm_mat); idem
  13.   for(int i=0; i<fm_dims[3]; i++)
  14.     gsl_matrix_free(fm_data[i]);
  15. }
  16. int
  17. FmVolume::loadIMG()
  18. {
  19.   int *flag = new int[2];
  20.   unsigned short* data;
  21.   int plane = INIT_VALUE;
  22.   float scale, thickness;
  23.   FILE* fp_hdr, *fp_img;
  24.  
  25.   if (fm_fname.size()== 0)
  26.     {
  27.       cerr << "No file selected."<<endl;
  28.       return EXIT_FAILURE;
  29.     }
  30.  
  31.   int hdrRead = (int)read_header(fp_hdr, fp_img, plane,flag);
  32.   if(hdrRead == 0.0)
  33.     return EXIT_FAILURE;
  34.   cout<<"Name : "<<fm_fname<<endl;
  35.   cout<<"Number of slices : "<<fm_dims[3]<<endl;
  36.   cout<<"Data type : "<<fm_dims[0]<<endl;
  37.  
  38. if(fm_error != 0)
  39.    {
  40.      cerr << "Error while loading " <<fm_fname<< endl;
  41.       return EXIT_FAILURE;
  42.    }
  43. for(int i=0; i<fm_dims[3]; i++)
  44.     fm_data[i] = gsl_matrix_alloc(fm_dims[1],fm_dims[2]);
  45.   data = new unsigned short[fm_dims[1]*fm_dims[2]];
  46. /*Recup des infos pour chaque plan*/
  47. gsl_matrix* temp = gsl_matrix_alloc(fm_dims[1],fm_dims[2]);
  48.   for (plane = 0; plane < fm_dims[3]; plane++)
  49.     {
  50.       scale = read_header(fp_hdr, fp_img, plane,flag);
  51.       if (scale > 0.0)
  52.         {
  53.   int imgRead = 0;//read_image(fp_hdr, fp_img, data,plane,flag,scale);
  54.    if (imgRead == EXIT_SUCCESS)
  55.     {
  56.       cout<<"plane "<<plane<<endl;
  57.       for (int i=0; i<fm_dims[1]; i++)
  58.  for (int j=0; j<fm_dims[2]; j++)
  59.       gsl_matrix_set(temp,i,j,data[j*fm_dims[1]+i]);
  60.      }
  61.     else
  62.      return EXIT_FAILURE;
  63.         }
  64.      fm_data[plane] = temp;
  65.     }
  66.   gsl_matrix_free(temp);
  67. cout<<"Slices width = "<<fm_dims[1]<<endl;
  68. cout<<"Slices height = "<<fm_dims[2]<<endl;
  69. thickness = fm_dim[2];
  70. cout<<"Slices thickness = "<<thickness<<endl;
  71. if (fp_hdr != NULL)
  72. fclose(fp_hdr);
  73. if (fp_img != NULL)
  74. fclose(fp_img);
  75. return EXIT_SUCCESS;
  76. }
  77. float
  78. FmVolume::read_header(FILE* fp_hdr, FILE* fp_img, int plane, int *flag)
  79. {
  80. struct hdr hdr;
  81.   string filename;
  82.   float scale;
  83.   if(plane<0)
  84.     {
  85.       fm_error=0;
  86.    
  87.        filename = fm_fname + HDR_SUFF;
  88.        fp_hdr = fopen(filename.c_str(),"rb" );
  89.        if (fp_hdr == NULL)
  90.         {
  91.           cerr<<"cannot open file " <<filename<<" for input."<<endl;
  92.   fm_error=1;
  93.           return 0.0;
  94.         }
  95.    
  96.        if(fread((char *)&hdr,1,sizeof(struct hdr),fp_hdr)!=sizeof(struct hdr))
  97.        {
  98.           cerr<<"file read error for file "<<filename<<endl;
  99.   fm_error=1;
  100.           return 0.0;
  101.   }
  102.       /*Copy required data from header struct*/
  103.       fm_dims[0] = hdr.bits;
  104.       fm_dims[1] = hdr.x_dim;
  105.       fm_dims[2] = hdr.y_dim;
  106.       fm_dims[3] = hdr.z_dim;
  107.      
  108.       fm_dim[0] = hdr.x_size;
  109.       fm_dim[1] = hdr.y_size;
  110.       fm_dim[2] = hdr.z_size;
  111.      
  112.       if(fm_dims[0]!=8 && fm_dims[0]!=16 && fm_dims[0]!=1)
  113.         {
  114.           cerr<<"Can't read data with "<<fm_dims[0]<<" bits/pixel ("<<filename<<" )"<<endl;
  115.   fm_error=1;
  116.           return 0.0;
  117.         }
  118.       flag[0]=hdr.glmin;
  119.       flag[1]=hdr.glmax;
  120.    
  121. /*Calculate global rescaling factor if image is 16 bit and compilation is 8 bit*/
  122. if(fm_dims[0]==16 && sizeof(unsigned short)==1)
  123.   {
  124.     if(hdr.glmin>=0)
  125.             {
  126.               if(hdr.glmax==0)
  127.  {
  128.    cerr<<"Header global maximum of zero is less than or equal to header global minimum ("<<filename<<" )\n";
  129.    fm_error=1;
  130.    return 0.0;
  131.  }
  132.               if(hdr.glmax>TWELVE_BITS_VALUE_I)
  133.  return SIXTEEN_BITS_VALUE/hdr.glmax;
  134.               else
  135.  return TWELVE_BITS_VALUE_F/hdr.glmax;
  136.             }
  137.     else
  138.     {
  139.       if(hdr.glmax<=-(TWELVE_BITS_VALUE_I + 1))
  140.     {
  141.       cerr<<"Header global maximum is out of possible range ("<<fm_fname<<" )"<<endl;
  142.       fm_error=1;
  143.       return 0.0;
  144.     }
  145.       return SIXTEEN_BITS_VALUE/(hdr.glmax+(TWELVE_BITS_VALUE_I + 1));
  146.             }
  147.   }
  148.       return 1.0;
  149.     }
  150.   else
  151.     {
  152.       fm_error=0;
  153.      
  154.       /* If initialization wasn't done--reject*/
  155.       if(fp_hdr==NULL)
  156. {
  157.   cerr<<"Coding error--failure to initialize read_header\n";
  158.   fp_img =NULL;
  159.   fm_error = 1;
  160.   return 0.0;
  161. }
  162.      
  163.       scale=1;
  164.      
  165.       /* If image file isn't already open, do so now and find plane*/
  166.       if(fp_img==NULL)
  167. {
  168.   filename = fm_fname+IMG_SUFF;
  169.   fp_img = fopen(filename.c_str(),"rb" );
  170.   if(fp_img == NULL)
  171.     {
  172.       cerr<<"cannot open file "<<filename<<" for input\n";
  173.       fm_error=1;
  174.             return 0.0;
  175.     }
  176.   if(plane>0)
  177.     {
  178.       if(fseek(fp_img,(long)plane*(fm_dims[0]/8)*fm_dims[1]*fm_dims[2],0)<0)
  179.  {
  180.    cerr<<"unable to seek to plane "<<plane<<" in file "<<filename<<"\n";
  181.    fm_error=1;
  182.    return 0.0;
  183.    }
  184.       return scale;
  185.     }
  186. }
  187.       /* Since image file is already open, we should be ready to read next plane*/
  188.       return scale;
  189.     }
  190. }


 
et le debugger me dit :
 
Program received signal SIGSEGV, Segmentation fault.
0x00000000 in ?? ()
 
... :pfff:


Message édité par nifnef le 28-07-2005 à 16:46:19
Reply

Marsh Posté le 26-07-2005 à 18:45:54    

en gros, je cherche à lire une image: dans le fichier .hdr on trouve les infos permettant de lire le .img qui contient les données brutes.

Reply

Marsh Posté le 27-07-2005 à 10:09:18    

nifnef a écrit :

Bonjour,
 
je suis sur cette erreur depuis un certain temps et j'ai peur d'avoir perdu tout recul pour la résoudre.
 

Code :
  1. #include "fm_volume.h"
  2. using namespace std;
  3. int main ()
  4. {
  5.   FmVolume* firstVolume = new FmVolume("1exam10_06_02" );
  6.   cout<<"yop"<<endl;
  7.   return 1;
  8. }


 
la classe FmVolume étant définie dans fm_volume.h.
Mon probleme c'est à l'execution : superbe segmentation fault apres "yop" ... :pt1cable:  
Se peut-il qu'il s'agisse d'erreurs de la classe FmVolume qui seraient "descendues" ?
Merci pour vos suggestions...


 
 
manquerait pas un

Code :
  1. delete firstvolume

des fois?

Reply

Marsh Posté le 27-07-2005 à 10:09:18   

Reply

Marsh Posté le 27-07-2005 à 12:54:40    

soit je met mon delete et ca plante dans le destructeur :  
 
Program received signal SIGSEGV, Segmentation fault.
gsl_matrix_free (m=0x0) at init_source.c:185
185       if (m->owner)
 
soit je ne le met pas :
 
Program received signal SIGSEGV, Segmentation fault.
0x40316f45 in _IO_cleanup () from /lib/libc.so.6
 
et je ne suis capable de résoudre aucun de ces pb

Reply

Marsh Posté le 27-07-2005 à 13:12:41    

ben t'as ta réponse. tu fais un gsm_matrix_free(0) ...

Reply

Marsh Posté le 27-07-2005 à 15:45:52    

Effectivement, j'essayais de detruire fm_mat qui n'etait pas alloué.
Mais ca a l'air de pas être le seul pb!
Bon, je crois que c'est pas clair pour moi les destructeurs ... j'ai lu a droite a gauche que je dois detruire les pointeurs?  
Donc dans mon cas, je détruis mon tableau de matrices (qui a été alloué et initialisé) et c'est tout?  
(ai-je raison de vouloir faire un free de ma matrice temporaire temp?)
 
si je fais delete[] fm_data apres, j'ai ca :
 
Program received signal SIGSEGV, Segmentation fault.
0x4031aaa4 in _int_free () from /lib/libc.so.6
 
ca m'enerve, j'ai l'impression que qq chose m'echappe

Reply

Marsh Posté le 27-07-2005 à 16:35:50    

je comprend pas trop les problèmes des gens avec l'allocation dynamique, y en a plein qui galère avec ca et pourtant c'est logique, tu alloue tu libère ca doit être automatique normalement (en tout cas pour moi) y a rien de plus à savoir.


---------------
http://www.blastmanu.info
Reply

Marsh Posté le 27-07-2005 à 16:58:22    

je comprendrai si ca marchait (non, je blague c'est pas garanti)... mais dans mon cas, tu peux me dire comment je dois libérer proprement?
j'ai essayé delete [] fm_data, j'ai aussi désalloué une part une les matrices du tableau (avec gsl_matrix_free) et ca marche pas.  
j'ai rajouté ca mais toujours pas d'amelioration ...

Code :
  1. delete fp_img;
  2.   delete fp_hdr;
  3.   delete [] flag;
  4.   delete [] data;


 
Program received signal SIGSEGV, Segmentation fault.
~basic_string (this=0xffffffff) at atomicity.h:40
40        __asm__ __volatile__ ("lock; xaddl %0,%2"
Current language:  auto; currently c++


Message édité par nifnef le 27-07-2005 à 17:20:32
Reply

Sujets relatifs:

Leave a Replay

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