Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme erreur de segmentation

    20 février 2018 à 11:59:34

    Bonjour a tous les amis codeur,

    Je vous sollicite aujourd’hui car je suis face à un problème que j'essaye de résoudre depuis plusieurs jours sans succès.

    voici mon code ou il y'a le problème de segmentation:

    #include <stdio.h>

    #include <stdlib.h>

    #include <assert.h>

    #include <string.h>

    #include <stdarg.h>

    #include <unistd.h>

    typedef struct{

        int val;

        int initial;

    } cellule;

    typedef struct{

        int n;               

        cellule *tab;        

    } grille;

    grille * creer_grille(int n){

         grille maGrille;

         grille *g = &maGrille;

         cellule c;

         g->tab = malloc( (n*n) * sizeof(c)); // probleme sizeof(c) vaut 8!!!!!!!!!!!!!!!!!!!!

         if(g->tab == NULL){

            printf("allocation impossible");

    exit(0);

         }

         int i = 0;

         while(i <= (n*n)-1){

            g->tab[i].val = -1;

            g->tab[i].initial = 0;

            i++;

         }

         g->n = n;

         return g;

    }

    void detruire_grille(grille * g){

        free(g->tab);

        g = NULL;

    }

    int est_indice_valide(grille * g, int indice){

        if( indice >= 0 && indice <= (g->n)-1 )

            return 1;

    else

    return 0;

    }               

    int est_cellule(grille * g, int i, int j){

        if(( est_indice_valide(g,i) == 1 ) && ( est_indice_valide(g,j) == 1 ))

            return 1;

    else

    return 0;

    }

    int get_val_cellule(grille * g, int i, int j){

        assert(est_cellule(g,i,j) == 1);

            return g->tab[(i * g->n) ].val;

    }

    void test_get_val_cellule(){

        grille * g = creer_grille(6);

    g->tab[0].val = 1;

    g->tab[6].val = 1;

    g->tab[15].val = 0;

    printf("%d\n",get_val_cellule(g,0,0));

    assert(get_val_cellule(g,0,0) == 1 && "Problème de valeur");

    assert(get_val_cellule(g,1,0) == 1 && "Problème de valeur");

    assert(get_val_cellule(g,2,3) == 0 && "Problème de valeur");

    assert(get_val_cellule(g,1,4) == -1 && "Problème de valeur");

    detruire_grille(g);

    printf("Test de la fonction get_val_cellule passé !\n");

    }

    int main()

    {

        test_get_val_cellule();

        return 0;

    };

    et voici mon deuxième code qui est fonctionnel:

    #include <stdio.h>

    #include <stdlib.h>

    #include <assert.h>

    #include <string.h>

    #include <stdarg.h>

    #include <unistd.h>

    typedef struct{

        int val;

        int initial;

    } cellule;

    typedef struct{

        int n;               

        cellule *tab;        

    } grille;

    void creer_grille(grille * g,int n){

         cellule c;

         g->tab = malloc( (n*n) * sizeof(c)); 

         if(g->tab == NULL){

            printf("allocation impossible");

    exit(0);

         }

         int i = 0;

         while(i <= (n*n)-1){

            g->tab[i].val = -1;

            g->tab[i].initial = 0;

            i++;

         }

         g->n = n;

    }

    void detruire_grille(grille * g){

        free(g->tab);

        g = NULL;

    }

    int est_indice_valide(grille * g, int indice){

        if( indice >= 0 && indice <= (g->n)-1 )

            return 1;

    else

    return 0;

    }               

    int est_cellule(grille * g, int i, int j){

        if(( est_indice_valide(g,i) == 1 ) && ( est_indice_valide(g,j) == 1 ))

            return 1;

    else

    return 0;

    }

    int get_val_cellule(grille * g, int i, int j){

        assert(est_cellule(g,i,j) == 1);

            return g->tab[(i * g->n) +j].val;

    }

    void test_get_val_cellule(grille * g){

        creer_grille(g,6);

    g->tab[0].val = 1;

    g->tab[6].val = 1;

    g->tab[15].val = 0;

    assert(get_val_cellule(g,0,6) == 1 && "Problème de valeur");

    assert(get_val_cellule(g,1,0) == 1 && "Problème de valeur");

    assert(get_val_cellule(g,2,3) == 0 && "Problème de valeur");

    assert(get_val_cellule(g,1,4) == -1 && "Problème de valeur");

    detruire_grille(g);

    printf("Test de la fonction get_val_cellule passé !\n");

    }

    int main()

    {

        grille maGrille;

        test_get_val_cellule(&maGrille);

        return 0;

    };

    Je tiens a préciser que j'ai fais une modification de structure dans mon deuxieme code c'est pour sa qu'il fonctionne. Mai jai besoin d'avoir la structure de mon premier code car c'est la structure que veut mon prof. Je doit donc trouver mon probleme tout en gardant la structure c'est donc pour sa que je vous sollicite.

    Je vous remercie d'avance les amis.

    • Partager sur Facebook
    • Partager sur Twitter
      20 février 2018 à 12:05:04

      Peux tu éditer ton message utiliser les balises </> pour poster du code s'il te plait?
      • Partager sur Facebook
      • Partager sur Twitter

      « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
      D. Mendeleïev

        20 février 2018 à 12:05:42

        Bnjour,

        Bouton </> et copiez collez votre code dans la fenetre qui apparait. Choisissez "c++" pour la coloration syntaxique. Faites en sorte que votre code se présente correctement avec une indentation correcte.

        • Partager sur Facebook
        • Partager sur Twitter
        ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
          20 février 2018 à 12:35:00

          Dsl c'est la premiere fois que je met un post sur le forum. Voici mon premier code avec l'erreur de segmentation

          #include <stdio.h>
          
          #include <stdlib.h>
          
          #include <assert.h>
          
          #include <string.h>
          
          #include <stdarg.h>
          
          #include <unistd.h>
          
          typedef struct{
          
              int val;
          
              int initial;
          
          } cellule;
          
          typedef struct{
          
              int n;               
          
              cellule *tab;        
          
          } grille;
          
          grille * creer_grille(int n){
          
               grille maGrille;
          
               grille *g = &maGrille;
          
               cellule c;
          
               g->tab = malloc( (n*n) * sizeof(c)); // probleme sizeof(c) vaut 8!!!!!!!!!!!!!!!!!!!!
          
               if(g->tab == NULL){
          
                  printf("allocation impossible");
          
          exit(0);
          
               }
          
               int i = 0;
          
               while(i <= (n*n)-1){
          
                  g->tab[i].val = -1;
          
                  g->tab[i].initial = 0;
          
                  i++;
          
               }
          
               g->n = n;
          
               return g;
          
          }
          
          void detruire_grille(grille * g){
          
              free(g->tab);
          
              g = NULL;
          
          }
          
          int est_indice_valide(grille * g, int indice){
          
              if( indice >= 0 && indice <= (g->n)-1 )
          
                  return 1;
          
          else
          
          return 0;
          
          }               
          
          int est_cellule(grille * g, int i, int j){
          
              if(( est_indice_valide(g,i) == 1 ) && ( est_indice_valide(g,j) == 1 ))
          
                  return 1;
          
          else
          
          return 0;
          
          }
          
          int get_val_cellule(grille * g, int i, int j){
          
              assert(est_cellule(g,i,j) == 1);
          
                  return g->tab[(i * g->n) ].val;
          
          }
          
          void test_get_val_cellule(){
          
              grille * g = creer_grille(6);
          
          g->tab[0].val = 1;
          
          g->tab[6].val = 1;
          
          g->tab[15].val = 0;
          
          printf("%d\n",get_val_cellule(g,0,0));
          
          assert(get_val_cellule(g,0,0) == 1 && "Problème de valeur");
          
          assert(get_val_cellule(g,1,0) == 1 && "Problème de valeur");
          
          assert(get_val_cellule(g,2,3) == 0 && "Problème de valeur");
          
          assert(get_val_cellule(g,1,4) == -1 && "Problème de valeur");
          
          detruire_grille(g);
          
          printf("Test de la fonction get_val_cellule passé !\n");
          
          }
          
          int main()
          
          {
          
              test_get_val_cellule();
          
              return 0;
          
          };

          et voici mon deuxieme code qui est fonctionnel:

          #include <stdio.h>
          
          #include <stdlib.h>
          
          #include <assert.h>
          
          #include <string.h>
          
          #include <stdarg.h>
          
          #include <unistd.h>
          
          typedef struct{
          
              int val;
          
              int initial;
          
          } cellule;
          
          typedef struct{
          
              int n;               
          
              cellule *tab;        
          
          } grille;
          
          void creer_grille(grille * g,int n){
          
               cellule c;
          
               g->tab = malloc( (n*n) * sizeof(c)); 
          
               if(g->tab == NULL){
          
                  printf("allocation impossible");
          
          exit(0);
          
               }
          
               int i = 0;
          
               while(i <= (n*n)-1){
          
                  g->tab[i].val = -1;
          
                  g->tab[i].initial = 0;
          
                  i++;
          
               }
          
               g->n = n;
          
          }
          
          void detruire_grille(grille * g){
          
              free(g->tab);
          
              g = NULL;
          
          }
          
          int est_indice_valide(grille * g, int indice){
          
              if( indice >= 0 && indice <= (g->n)-1 )
          
                  return 1;
          
          else
          
          return 0;
          
          }               
          
          int est_cellule(grille * g, int i, int j){
          
              if(( est_indice_valide(g,i) == 1 ) && ( est_indice_valide(g,j) == 1 ))
          
                  return 1;
          
          else
          
          return 0;
          
          }
          
          int get_val_cellule(grille * g, int i, int j){
          
              assert(est_cellule(g,i,j) == 1);
          
                  return g->tab[(i * g->n) +j].val;
          
          }
          
          void test_get_val_cellule(grille * g){
          
              creer_grille(g,6);
          
          g->tab[0].val = 1;
          
          g->tab[6].val = 1;
          
          g->tab[15].val = 0;
          
          assert(get_val_cellule(g,0,6) == 1 && "Problème de valeur");
          
          assert(get_val_cellule(g,1,0) == 1 && "Problème de valeur");
          
          assert(get_val_cellule(g,2,3) == 0 && "Problème de valeur");
          
          assert(get_val_cellule(g,1,4) == -1 && "Problème de valeur");
          
          detruire_grille(g);
          
          printf("Test de la fonction get_val_cellule passé !\n");
          
          }
          
          int main()
          
          {
          
              grille maGrille;
          
              test_get_val_cellule(&maGrille);
          
              return 0;
          
          };




          • Partager sur Facebook
          • Partager sur Twitter
            20 février 2018 à 15:13:00

            Bonjour,

            grille maGrille;
            grille *g = &maGrille;
            
            /* ... */
            
            return g; 

            Ta fonction retourne l'adresse d'une variable (maGrille) créée localement.

            Cette variable "n'existe plus"  à la sortie de la fonction.

            C'est comme si tu écrivais ça :

            int * mafonction(){
              int nb = 10;
              return &nb;
            }

            D'autre part, tu as aussi une erreur d'indice :

             return g->tab[(i * g->n) ].val;

            -
            Edité par OlivierPlesi 20 février 2018 à 15:27:15

            • Partager sur Facebook
            • Partager sur Twitter
              20 février 2018 à 17:29:52

              Je te remercie de ta réponse. C'est un peu plus clair pour moi maintenant.

              Sa veut donc dire que je ne peut pas garder cette structure??

              grille * creer_grille(int n){
                    /*.....*/
                    return g;
              }



              • Partager sur Facebook
              • Partager sur Twitter
                20 février 2018 à 17:37:28

                Si mais il faut que tu alloues dynamiquement g via malloc.
                • Partager sur Facebook
                • Partager sur Twitter
                ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
                  20 février 2018 à 17:52:18

                  C'est possible si tu alloues dynamiquement la mémoire nécessaire pour maGrille avec un malloc.

                  Le problème dans ton code 

                  grille maGrille;

                  c'est que la mémoire pour la variable maGrille n'est réservée que pendant le temps de la fonction creer_grille.

                  Quand tu retournes dans le main, tu récupères un pointeur sur cette zone mémoire, mais celle-ci n'est plus réservée ... ce qui donne un comportement relativement aléatoire au programme.

                   Si tu utilises un malloc, la mémoire ne sera libérée que lorsque tu le décideras.

                  grille * maGrille = malloc(...)



                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 février 2018 à 21:00:33

                    Merci pour vos reponse. Je les ai appliquer mai je me retrouve face a un nouveau probleme. Je n'arrive plus a accéder a la variable contenue dans cellule qui est elle meme contenue dans grille pour la modifier :-(

                    grille * creer_grille(int n){
                         cellule c;
                         grille *g = malloc( (n*n) * sizeof(c));
                         if(g == NULL){
                            printf("allocation impossible");
                    		exit(0);
                         }
                         int i = 0;
                         while(i <= (n*n)-1){
                            g[i].tab = -1;
                            //g->tab[i].initial = 0;
                            i++;
                         }
                         g->n = n;
                         return g;
                    }

                    merci encore pour vos reponse

                    • Partager sur Facebook
                    • Partager sur Twitter
                      20 février 2018 à 21:33:45

                           grille *g = malloc( sizeof(grille));
                           g->tab = malloc( (n*n) * sizeof(cellule));
                      
                      • Partager sur Facebook
                      • Partager sur Twitter
                      ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
                        20 février 2018 à 23:57:22

                        C'est bon sa marche nickel. Merci beaucoup pour votre aide les gars :-)
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Probleme erreur de segmentation

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown