IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Erreur de segmentation


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 91
    Par défaut Erreur de segmentation
    Bonjour,

    en entrant un certain nombre de données dans un tableau, je me retrouve joyeusement avec un sympathique segmentation fault dont je n'arrive pas à trouver la cause.

    Voici comment le pointeur dans lequel je rentre les données est instancié (sachant que je ne peux pas modifier cette partie du code) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    TYPEMRI3D ***cr_mri_3d(UINT width, UINT height, UINT depth)
    {
      TYPEMRI3D *t1, ***t3;
      unsigned int       i, j;
     
      if((t3 = CALLOC((width + 1), TYPEMRI3D**)) == NULL)
        return (TYPEMRI3D***)NULL;
     
      if((t3[0] = CALLOC((width * height), TYPEMRI3D*)) == NULL)
        {
          FREE(t3);
          return (TYPEMRI3D***)NULL;
        }
     
      for(i = 1 ; i < width ; i++)
        t3[i] = t3[i - 1] + height;
     
      if((t3[0][0] = CALLOC((width * height * depth), TYPEMRI3D)) == NULL)
        {
          FREE(t3[0]);
          FREE(t3);
          return (TYPEMRI3D***)NULL;
        }
     
      t1 = t3[0][0];
     
      for(i=0 ; i < width ; i++)
        {
          for(j = 0 ; j < height ; j++)
            {
          t3[i][j] =  t1;
          t1       += depth;
            }
        }
     
      return t3;
    }
    TYPEMRI3D est en fait un type short. Cette fonction renvoie donc un tableau à 3 dimensions qui fera partie d'une structure dont le champ en question est nommé mri.

    Voilà maintenant mon propre code, dans lequel j'entre des données dans le tableau mri :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for(i=0; i<image->width; i++){
            for(j=0; j<image->height; j++){
                for(k=0; k<image->depth; k++){
                    image->mri[i][j][k] = (*(TYPEMRI3D*)image_data);
     
                    if(i+1 != image->width){
                        image_data += image->bitppixel / 8; //on incrémente du nombre de bits par voxel
                    }
                }
            }
        }
    image->bitppixel / 8 donne sizeof(short) et width, height et depth ici sont inférieurs ou égaux aux dimensions respectives du tableau.

    image_data, qui référence les données (de type short) à stocker dans mri, est en fait un pointeur de type void * instancié comme tel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (void *)calloc(1,nim->nbyper * nim->nvox);
    nbyper étant égal à sizeof(short) et nvox correspondant à image->width * image->height * image->depth.

    D'après mon debugger, l'erreur de segmentation a lieu lors de l'affectation des données dans mri.

    Je remercie mes futurs sauveteurs

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Atharendil
    Voici comment le pointeur dans lequel je rentre les données est instancié (sachant que je ne peux pas modifier cette partie du code) :
    Donne du code compilable complet et réduit au minimum qui montre le défaut.

  3. #3
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    D'après mon debugger, l'erreur de segmentation a lieu lors de l'affectation des données dans mri.
    C'est donc ici : (???)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mage->mri[i][j][k] = (*(TYPEMRI3D*)image_data);
    mri je suppose que tu l'obtiens comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mri = cr_mri_3d(w,h,d);
    Testes tu la valeur de mri avant d'appeler tes trois boucles ?

    Je remplacerai ceci :
    par ceci :
    Ton segfault aparait il lors de la première itération de la boucle ou bien après ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 91
    Par défaut
    Merci à vous pour vos réponses et désolé de répondre si tard (WE oblige ) !

    Emmanuel, je voudrais bien mettre du code compilable mais ça n'va pas être réellement possible vu que j'utilise, rien que pour ces petits bouts de code, plusieurs librairies d'entrées/sorties... et il faudrait aussi que je mette le code intégral de la sauvegarde (puisque le code plus haut correspond en fait au chargement d'une image).

    PRomuald, pour te répondre, il est vrai que je ne teste pas la valeur de mri avant de rentrer les données dedans, peut-être devrais-je le faire, je vais essayer cela.

    C'est donc ici : (???)

    Code :
    mage->mri[i][j][k] = (*(TYPEMRI3D*)image_data);
    Oui, c'est bien ici que l'erreur de segmentation se produit et bien après la 1ère itération de la boucle (j'ai même l'impression que c'est vers la fin, voire après la fin, d'où l'erreur).

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 11h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo