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 :

Matrice : Erreur de segmentation à l'affichage


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant à L'ESIEA
    Inscrit en
    Décembre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant à L'ESIEA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2017
    Messages : 9
    Par défaut Matrice : Erreur de segmentation à l'affichage
    Bonjour à tous,

    J'ai un problème lorsque j'exécute mon programme qui doit permettre d'afficher d'abord un tableau de valeurs aléatoires puis une matrice. Une erreur de segmentation se produit quand le programme essaie d'afficher la matrice et lorsque qu celle-ci est libéré.

    Voici les fichiers :
    exo4.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #ifndef EXO4_H
    #define EXO4_H
    /* Pour les tableaux */
    int *AllocTab(int n);
    void RandTab( int *tab, int n, int a, int b );
    void FreeTab( int *tab );
     
    /* Pour les matrices */
    int** AllocMat( int nbRows, int nbCols );
    void RandMat( int **mat, int nbRows, int nbCols, int a, int b );
    void FreeMat( int **mat, int nbRows );
     
    #endif
    exo4.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
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    #include "EXO4.h"
     
    int main(int argc, char **argv)
    {
      int n, a, b, i, j;
      int nbRows, nbCols;
     
      printf("Taille du tableau: ");
      scanf("%d", &n);
      printf("Génération de nombre aléatoire entre a et b:");
      printf("\na: ");
      scanf("%d", &a);
      printf("\nb: ");
      scanf("%d", &b);
     
      /* Allocation du tableau statique */
      int *tab=AllocTab(n);
      /* Remplissage du tableau */
      RandTab(tab, n, a, b);
      /* Libération du tableau */
      FreeTab(tab);
      /* Affichage du tableau */
      for(i=0; i<n; i++)
      {
        printf("\n%d", tab[i]);
      }
     
      printf("\nNombre de lignes et colonnes de la matrice:");
      printf("\nnbRows: ");
      scanf("%d", &nbRows);
      printf("\nnbCols: ");
      scanf("%d", &nbCols);
     
      /* Allocation de matrices */
      int **mat=AllocMat(nbRows, nbCols);
      /* Remplissage de la matrice */
      RandMat(mat, nbRows, nbCols, a, b);
      /* Affichage matrice */
      for (i=0; i<nbRows; i++)
      {
        for(j=0; j<nbCols; j++)
        {
          printf(" %d ", mat[i][j]);
          if(j==nbCols)
          {
            printf("\n");
          }
        }
      }
      /* Libération de la matrice */
      FreeMat(mat, nbRows);
     
      return 0;
    }
     
     
     
    /* Pour les tableaux */
    int* AllocTab( int n )
    {
      int *tab=(int*)calloc(n, sizeof(int));
      return tab;
    }
     
    void RandTab( int *tab, int n, int a, int b )
    {
      srand(time(NULL));
      int i;
      for(i=0; i<n; i++)
      {
        tab[i]=(a + rand()%(b-a));
      }
    }
     
    void FreeTab( int *tab )
    {
      free(tab);
    }
     
     
     
     
    /* Pour les matrices */
    int** AllocMat( int nbRows, int nbCols )
    {
      int i;
      int **mat=(int**)calloc(nbRows, sizeof(int));
      for(i=0; i<nbRows; i++)
      {
        mat[i]=(int*)calloc(nbCols, sizeof(int));
      }
      return mat;
    }
     
    void RandMat( int **mat, int nbRows, int nbCols, int a, int b )
    {
      int i, j;
      for(i=0; i<nbRows; i++)
      {
        for(j=0; j<nbCols; j++)
        {
          mat[i][j]=(a + rand()%(b-a));
        }
      }
    }
     
    void FreeMat( int **mat, int nbRows )
    {
      printf(" ");
      int i;
      for(i=0; i<nbRows; i++)
      {
        free(mat[i]);
      }
      free(mat);
    }
    Je compile avec gcc de cette manière sous linux: gcc -Wall EXO4.c -o EXO4.out
    Si quelqu'un comprend le problème, je serait ravie de le savoir.

    Je vous remercie d'avance pour votre aide
    Fichiers attachés Fichiers attachés
    • Type de fichier : c EXO4.c (2,0 Ko, 53 affichages)
    • Type de fichier : h EXO4.h (328 octets, 45 affichages)

  2. #2
    Membre émérite
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Chercheur en sécurité

    Informations forums :
    Inscription : Juin 2013
    Messages : 335
    Par défaut
    Bonjour,

    Ah, les problèmes de mémoire en C.


    Dans ton code, tu libère ton tableau et tu le lis après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      /* Libération du tableau */
      FreeTab(tab);
      /* Affichage du tableau */
      for(i=0; i<n; i++)
      {
        printf("\n%d", tab[i]);
      }
    Tu as un accès invalide et le comportement de ton programme devient indéterminé. Il peut alors planter ou ne pas planter (ce qui est encore pire).
    D'autre part vérifie ta ligne d'allocation de ta matrice...

    Pour corriger des erreurs mémoires par la suite tu as deux possibilité (non exclusives),
    - Soit tu trouves les erreurs manuellement
    - Soit tu utilises Valgrind qui checke les accès mémoire pour toi.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant à L'ESIEA
    Inscrit en
    Décembre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant à L'ESIEA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2017
    Messages : 9
    Par défaut Résolu
    Merci pour ta réponse. J'ai modifié mon code et résolu le problème. En fait je me suis trompé lorsque j'ai donné la taille des cases de la matrices, j'ai déclaré la matrice mat de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      int **mat=(int**)calloc(nbRows, sizeof(int));
    Au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      int **mat=(int**)calloc(nbRows, sizeof(int*));
    C'est tout bête mais merci quand même. Je l'ai trouvé grâce à Valgrind !

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 814
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par olafsergent Voir le message
    En fait je me suis trompé lorsque j'ai donné la taille des cases de la matrices, j'ai déclaré la matrice mat de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      int **mat=(int**)calloc(nbRows, sizeof(int));
    Au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      int **mat=(int**)calloc(nbRows, sizeof(int*));
    Tu pourrais te simplifier la vie si tu considérais ta matrice comme un tableau 1D (ce qu'elle est d'ailleurs en réalité). Tu te ferais plus suer dans tes allocations et libérations en cascade. Un simple malloc à l'entrée, un free à la fin et c'est tout.

    Le seul détail serait de devoir convertir un indice "i" en "lig/col" lors de l'accès aux éléments mais ça se règle assez facilement car lig=i/nbRows et col=i%nbRows. Et dans l'autre sens, i=lig * nbRows + col...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/08/2014, 10h38
  2. erreur de segmentation sur matrice
    Par Trax31 dans le forum C
    Réponses: 15
    Dernier message: 31/05/2013, 10h41
  3. Réponses: 6
    Dernier message: 19/03/2012, 01h53
  4. Réponses: 23
    Dernier message: 08/01/2006, 22h59
  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