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.. qu'est ce que cela signifie ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2016
    Messages : 4
    Par défaut Erreur de segmentation.. qu'est ce que cela signifie ?
    Bonjour,

    Pouvez m'aider à comprendre d'où vient cette erreur de segmentation lorsque je lance ce programme, et qu'est qu'elle signifie ?

    Dans ce programme je chercher à afficher le plateau du jeu reversi de taille 8*8. Les contraintes sont d'utiliser un tableau à 2 dimensions, et la fonction malloc pour pouvoir ensuite créer une fonction qui efface proprement le plateau de la mémoire.

    Merci d'avance pour votre aide !

    Je souhaite obtenir ceci :
    Nom : Capture du 2016-09-24 16-20-14.png
Affichages : 264
Taille : 23,5 Ko

    voici mon code source (supposé être en langage c :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define EXIT_SUCCESS 0
    #define EXIT_FAILURE 1
     
    #define BLACK_STONE 'X'
    #define WHITE_STONE 'O'
    #define EMPTY_STONE '_'
     
     
    size_t board_size;//variable globale
     
    void board_init(size_t width, char **board)
    {
      size_t i,j;
      board_size=width+1;
      size_t size = width+1;
      board = malloc(size*sizeof(char*));
      if(board==NULL)
        {
          fprintf(stderr,"Error during the memory allocation.\n");
          exit(EXIT_FAILURE);
        }
      for(i=0;i<size;i++)
        {
          board[i]=malloc(size*sizeof(char));
          if(board[i]==NULL)
    	{
    	  fprintf(stderr,"Error during the memory allocation.\n");
    	  exit(EXIT_FAILURE);
    	}
        }
       char a = 'A';
       int k = 0;
     
        board[0][0]=' ';
     
        for (i=1;i<size;i++)
        {
            board[i][0]=a;
            a++;
        }
     
        for (j=1;j<size;j++)
        {
            board[0][j]= k;
            k++;
        }
     
        int m = size/2;
        int n = size/2+1;
        for (i=1;i<size;i++)
        {
            for (j=1;j<size;j++)
            {
                if (i == m && j == m)
    	      board[m][m]=BLACK_STONE;
                else if (i == m && j == n)
    	      board[m][n]=WHITE_STONE;
                else if (i == n && j == m)
    	      board[n][m]=WHITE_STONE;
                else if (i == n && j == n)
    	      board[n][n]=BLACK_STONE;
                else
    	      board[i][j]=EMPTY_STONE;
            }
        }
        printf("\n");
    }
     
    void display_board(size_t width, char **board)
    {
      size_t i,j;
        size_t size = width+1;
        int m = size/2;
        int n = (size/2)+1;
        printf("%4c",board[0][0]);
        for (j=1;j<size;j++)
        {
            printf("%4d",board[0][j]);
        }
        printf("\n");
        for (i=1;i<size;i++)
        {
            for (j=0;j<size;j++)
            {
                if (i == m && j == m)
                    printf("%4c",board[m][m]);
                else if (i == m && j == n)
                    printf("%4c",board[m][n]);
                else if (i == n && j == m)
                    printf("%4c",board[n][m]);
                else if (i == n && j == n)
                    printf("%4c",board[n][n]);
                else
                    printf("%4c",board[i][j]);
            }
            printf("\n");
        }
    }
     
    void board_delete(char **board)
    {
      size_t i;
      for(i=0;i<board_size;i++)
        {
        free(board[i]);
        }
      free(board);
    }
     
     
    int main(int argc, char* argv[])
    {
      char **board;
      board_init(8,board);
      //display_board(8,board);
      // board_delete(board);
      printf("%4c",board[2][3]);
     
      return EXIT_SUCCESS;
    }

  2. #2
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Bonjour,

    Premièrement (ou zéroièmement …) il faut lire les messages de son compilateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    rev2.c:118:3: warning: ‘board’ is used uninitialized in this function [-Wuninitialized]
       board_init(8,board);
       ^~~~~~~~~~~~~~~~~~~
    Cela vient d'un problème de compréhension des pointeurs et des passages de paramètres par valeur.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2016
    Messages : 4
    Par défaut
    Merci pour ta réponse,
    Désolé, j'ai oublié de préciser que je débute à peine en programmation, je ne comprend pas ce message d'erreur, pourrait tu m'en dire davantage s'il te plait ?

    Chez moi, je n'ai aucun message qui s'affiche aprés la compilation, que j'ai faite à partir de la commande : gcc reversi.c -o reversi
    Le seul message qui s'affiche est : erreur de segmentation (core dumpeb) aprés avoir tapés la commande ./reversi

  4. #4
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Une bonne pratique si tu compiles en ligne de commande (ou pas d'ailleurs …) est de demander un peu plus de messages d'erreurs. Avec gcc, on va dire que le minimum vital est constitué des 2 options -Wall -Wextra. Ces deux options vont te donner un peu plus de messages. Certains pourront être ignorés (une fois que tu les auras lu et compris évidemment), d'autres pointeront des erreurs.

    Lorsque tu donnes un paramètre à une fonction, la valeur de paramètre est donnée à la fonction. C'est le classique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void foo(int param)
    {
      param = param + 42;
    }
     
    int main(void)
    {
      int integer=12;
      foo(integer);
      printf("integer = %d\n", integer);
     
      return 0;
    }
    Ce code (tapé à la volée, non vérifié, …) affichera 12 et non 54. Si tu modifies le paramètre dans une fonction, au retour de la fonction le paramètre donné à la fonction ne sera pas modifié car on ne passe pas le paramètre mais uniquement sa valeur. C'est pourquoi on dit qu'en C le passage de paramètre se fait «par valeur».
    Comme un pointeur n'est qu'une variable comme une autre il se passe la même chose.

    La solution ? Soit passer un pointeur sur le paramètre, soit renvoyer le résultat. La seconde solution pourrait ressembler à :
    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
    char **board_init(size_t width)
    {
      char **board;
      ....
     
      return board;
    }
     
    ...
     
    int main(void)
    {
      char **board;
      board=board_init(8);
      ...
     
      return EXIT_SUCESS;
    }
    Quelques remarques :

    C'est bien de vérifier le retour des fonctions d'allocation.
    C'est bien de vérifier sur une feuille de papier avec un crayon que tes algos sont corrects.
    C'est mal de redéfinir des constantes qui existent par ailleurs (EXIT_SUCCESS, EXIT_FAILURE)
    ...

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2016
    Messages : 4
    Par défaut
    Les deux options ont été rajoutées... et toute une liste de warning est apparue..!
    J'ai bien compris ton exemple "classique", pour obtenir 54 il aurait fallu faire, je pense.. (j'attend ta confirmation) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void foo(int *param)
    {
      *param = *param + 42;
    }
     
    int main(void)
    {
      int integer=12;
      foo(&integer);
      printf("integer = %d\n", integer);
     
      return 0;
    }
    En revanche, j'ai appliqué ce que tu m'a conseillé pour mon tableau 2D, le resulat est le même : erreur de segmentation..

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    static char **board_init(size_t width)
    {
      char **board;
      size_t i,j;
      size_t size = width+1;
      board = malloc(size*sizeof(char*));
      if(board==NULL)
        {
          fprintf(stderr,"Error during the memory allocation.\n");
          exit(EXIT_FAILURE);
        }
      for(i=0;i<size;i++)
        {
          board[i]=malloc(size*sizeof(char));
          if(board[i]==NULL)
    	{
    	  fprintf(stderr,"Error during the memory allocation.\n");
    	  exit(EXIT_FAILURE);
    	}
        }
       char a = 'A';
       int k = 0;
     
        board[0][0]=' ';
     
        for (i=1;i<size;i++)
        {
            board[i][0]=a;
            a++;
        }
     
        for (j=1;j<size;j++)
        {
            board[0][j]= k;
            k++;
        }
     
        size_t m = size/2;
        size_t n = size/2+1;
        for (i=1;i<size;i++)
        {
            for (j=1;j<size;j++)
            {
                if (i == m && j == m)
    	      board[m][m]=BLACK_STONE;
                else if (i == m && j == n)
    	      board[m][n]=WHITE_STONE;
                else if (i == n && j == m)
    	      board[n][m]=WHITE_STONE;
                else if (i == n && j == n)
    	      board[n][n]=BLACK_STONE;
                else
    	      board[i][j]=EMPTY_STONE;
            }
        }
        printf("\n");
        return board;
    }
     
    int main(int argc, char* argv[])
    {
      char **board;
      board=board_init(8);
      printf("%4c",board[2][3]);
     
      return EXIT_SUCCESS;
    }

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 600
    Par défaut
    Bonjour,
    Citation Envoyé par X-zero Voir le message
    Les deux options ont été rajoutées... et toute une liste de warning est apparue..!
    Il faut lire les warnings. Un warning c'est un gros doute du compilateur et il connait mieux le langage que nous. Il faut les comprendre et corriger son code. Tu peux demander ici ceux qui te sont obscurs.
    Citation Envoyé par X-zero Voir le message
    J'ai bien compris ton exemple "classique", pour obtenir 54 il aurait fallu faire, je pense.. (j'attend ta confirmation) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void foo(int *param)
    {
      *param = *param + 42;
    }
    C'est tout à fait ça, via un pointeur on peut accéder au paramètre initial.
    Citation Envoyé par X-zero Voir le message
    En revanche, j'ai appliqué ce que tu m'a conseillé pour mon tableau 2D, le resulat est le même : erreur de segmentation..
    Rien ne devrait provoquer de défaut de segmentation dans ce code.
    Mais ligne 36, plutôt que int k = 0; il faut faire char k = '0'; car on veut afficher les caractères 0 à 7. Le nombre 0 dans un char n'est pas un caractère affichable.
    L'erreur n'est-elle pas dans une des fonctions que tu as mis en commentaire et que tu ne fournis pas?

    Dalfab

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. p-value=0 qu'est ce que cela signifie?
    Par CynthiaC dans le forum R
    Réponses: 0
    Dernier message: 05/03/2015, 17h36
  2. Réponses: 7
    Dernier message: 18/06/2010, 11h38
  3. "%*c%c" qu'est ce que cela signifie
    Par karlakir dans le forum C
    Réponses: 2
    Dernier message: 01/04/2009, 16h30
  4. Créer un 'product' sur un projet qu'est-ce que cela signifie ?
    Par tiph02 dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 04/02/2009, 12h08
  5. Vector, est ce que cela vaut la peine
    Par elekis dans le forum SL & STL
    Réponses: 6
    Dernier message: 11/12/2005, 21h22

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