Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1349 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++] petit pb de seg. fault

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] petit pb de seg. fault

n°1160557
nifnef
Posté le 26-07-2005 à 17:26:38  profilanswer
 

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
mood
Publicité
Posté le 26-07-2005 à 17:26:38  profilanswer
 

n°1160563
Taz
bisounours-codeur
Posté le 26-07-2005 à 17:31:18  profilanswer
 

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

n°1160568
nifnef
Posté le 26-07-2005 à 17:38:28  profilanswer
 

a pas grand chose effectivement...

n°1160597
theshockwa​ve
I work at a firm named Koslow
Posté le 26-07-2005 à 18:03:29  profilanswer
 

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

n°1160605
nifnef
Posté le 26-07-2005 à 18:07:08  profilanswer
 

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
n°1160610
nifnef
Posté le 26-07-2005 à 18:10:51  profilanswer
 

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.

n°1160628
Taz
bisounours-codeur
Posté le 26-07-2005 à 18:32:18  profilanswer
 

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

n°1160642
nifnef
Posté le 26-07-2005 à 18:42:46  profilanswer
 

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
n°1160645
nifnef
Posté le 26-07-2005 à 18:45:54  profilanswer
 

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.

n°1161128
sankukai8
Posté le 27-07-2005 à 10:09:18  profilanswer
 

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?

mood
Publicité
Posté le 27-07-2005 à 10:09:18  profilanswer
 

n°1161427
nifnef
Posté le 27-07-2005 à 12:54:40  profilanswer
 

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

n°1161446
Taz
bisounours-codeur
Posté le 27-07-2005 à 13:12:41  profilanswer
 

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

n°1161684
nifnef
Posté le 27-07-2005 à 15:45:52  profilanswer
 

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

n°1161858
blastman
just me !
Posté le 27-07-2005 à 16:35:50  profilanswer
 

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
n°1161907
nifnef
Posté le 27-07-2005 à 16:58:22  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++] petit pb de seg. fault

 

Sujets relatifs
petit probleme script de menu deroulant[Javascript] Petit problème de fonction
[C/C++] kernel 2.6.12 => segmentation faultpetit pb de requete !!!
Ecrire du texte sur une frame petit à petitDivers petit probleme mysql/phpmyadmin
Système de paiement par carte bancaire pour un petit site de commerce?Petit soucis de padding...
Polices Viendez lire mon deernier messagePetit probleme de Background avec ie.
Plus de sujets relatifs à : [C++] petit pb de seg. fault


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR