Soutenez-nous
Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Invité régulier
    Profil pro Karim
    Inscrit en
    juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Nom : Karim
    Localisation : France

    Informations forums :
    Inscription : juin 2010
    Messages : 22
    Points : 7
    Points
    7

    Par défaut Erreur de segmentation (core dumped)

    Bonjour,

    J'ai créer un programme qui calcule le produit matriciel

    Voilà mon programme de test :

    Code :
    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
    #include <stdio.h> 
    #include <time.h>  
     
     
     
    //Procédure pour remplir les elements du matrice
     
    void lire(int A[4][4],int B[4][4]);
     
     
    //procédure calcule le produit des deux matrices
     
    void calculer(int A[4][4],int B[4][4],int AB[4][4]);
     
    //procédure pour afficher les résultats de calcul
     
    void afficher(int A[4][4],int B[4][4],int AB[4][4]);
     
    int main()
    {
     
     //Déclaration des matrices
     
     int A[4][4],B[4][4],AB[4][4];
     
     lire(A,B);
     calculer(A,B,AB);
     afficher(A,B,AB);
     
     return 0;
     
    }
     
    void lire(int A[4][4],int B[4][4]){
     
      int i,j;
     
      for(i=0;i<5;i++)
     
        {
     
            for(j=1;j<5;j++)
     
            {
               //génération de nombre entre 1 et 10
     
               A[i][j]=rand()%10;
               B[i][j]=rand()%10;
     
            }
     
        }
     
     
    }
     
     
    void calculer(int A[4][4],int B[4][4],int AB[4][4]){
     
       int i,j;
     
          for (i = 0; i < 4; i++){
     
              for (j = 0; j < 4; j++){
     
                  int z;
     
                  AB[i][j] = 0;
     
                  for (z = 0; z < 4; z++){
     
                    AB[i][j] += A[i][z] * B[z][j];
     
                  }
     
    		 }
     
    	  }
     
    }
     
     
     
     
    void afficher(int A[4][4],int B[4][4],int AB[4][4]){
     
     
    	 int j=0,i=0;  
     
    	printf("=> A * B = AB :\n");
     
    	         for(i=0;i<4;i++){
     
    		      printf("| %d  %d  %d  %d |  ",A[i][j],A[i][j+1],A[i][j+2],A[i][j+3]);
    			  printf("| %d  %d  %d  %d |  ",B[i][j],B[i][j+1],B[i][j+2],B[i][j+3]);
    			  printf("| %d  %d  %d  %d |  \n",AB[i][j],AB[i][j+1],AB[i][j+2],AB[i][j+3]);
     
    			  }
     
     
    }
    Ca se compile sans problème (sous Linux).Mais lors d'affichage des résultats y a une erreur voilà :



    Code :
    1
    2
    3
    4
    5
    6
    7
    [user@localhost Produit Matriciel]$ ./produit
    => A * B = AB :
    | 2  8  7  6 |  | 0  6  5  5 |  | 112  62  126  168 |  
    | 2  9  2  0 |  | 2  1  7  9 |  | 30  33  85  107 |  
    | 3  0  2  1 |  | 6  6  6  8 |  | 21  30  30  36 |  
    | 7  2  2  7 |  | 9  0  3  5 |  | 79  56  82  104 |  
    Erreur de segmentation (core dumped)
    Alors je sais pas de quoi s'agit-il.

    Merci pour votre aide

  2. #2
    Membre actif

    Ingénieur développement logiciels
    Inscrit en
    février 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : février 2008
    Messages : 39
    Points : 161
    Points
    161

    Par défaut

    Salut,

    La segmentation fault - core dump survient souvent quand tu tapes dans une zone mémoire que tu n'es pas censé utiliser. Typiquement dans ton programme, il faut voir si tu ne tapes pas sur un indice qui n'existe pas pour ton tableau.

    Tes tableaux sont déclarés en [4][4], les indices vont donc de 0 à 3 au delà, tu as un core dump.

    Si on reprend la fonction lire :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void lire(int A[4][4],int B[4][4])
    {
    	int i,j;
    	for(i=0;i<5;i++)
    	{
    		for(j=1;j<5;j++)
    		{
    			//génération de nombre entre 1 et 10
    			A[i][j]=rand()%10;
    			B[i][j]=rand()%10;
    		}
    	}
    }
    Ton premier for va de 0 à 4 soit un indice de trop, le second va de 1 à 4, tu n'initialises donc pas le rang 0 et tu tapes dans le rang 4 qui n'existe pas. Voila, ce que je te propose :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void lire(int A[4][4],int B[4][4])
    {
    	int i,j;
    	for(i=0;i<4;i++)
    	{
    		for(j=0;j<4;j++)
    		{
    			//génération de nombre entre 1 et 10
    			A[i][j]=rand()%10;
    			B[i][j]=rand()%10;
    		}
    	}
    }
    Les fonctions claculer() et afficher() sont bonnes quant à elles.

    Bonne journée,

    Aldiemus

  3. #3
    Invité régulier
    Profil pro Karim
    Inscrit en
    juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Nom : Karim
    Localisation : France

    Informations forums :
    Inscription : juin 2010
    Messages : 22
    Points : 7
    Points
    7

    Par défaut

    Oui ca marche bien merci beaucoup.

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •