Probléme avec les matrices

Probléme avec les matrices - C - Programmation

Marsh Posté le 03-04-2009 à 19:51:49    

Bonjour a tous, lorsque j'exécute mon programme, windows m'affiche une fenetre d'erreur, voila mon code source:

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int** soustraction(int **mat1,int **mat2,int N, int M)
  4. {
  5.    int i,j;
  6.    int mat3[2][2];
  7.         for( i=0; i<N; i++ )
  8.             for( j=0; j<M; j++ )
  9.                 mat3[i][j] = mat1[i][j]-mat2[i][j];
  10. return mat3;
  11. }
  12. main()
  13. {
  14.    int matrice1[10][10], matrice2[2][2];
  15.    int **matrice3;
  16.    int i,j;
  17.    for(i=0;i<2;i++)
  18.       for(j=0;j<2;j++)
  19.       {
  20.          scanf("%d",&matrice1[i][j]);
  21.       }
  22.    for(i=0;i<2;i++)
  23.       for(j=0;j<2;j++)
  24.       {
  25.          scanf("%d",&matrice2[i][j]);
  26.       }
  27.    matrice3=soustraction(matrice1,matrice2,2,2);
  28.    //affichage
  29.       printf("\nLa Differance entre les deux Matrice est:\n\n" );
  30.    for(i=0;i<10;i++)
  31.       for(j=0;j<10;j++)
  32.       {
  33.          printf("%d",matrice3[i][j]);
  34.       }
  35. }


Qulequ'un peu me dire pourquoi???! Merci

Reply

Marsh Posté le 03-04-2009 à 19:51:49   

Reply

Marsh Posté le 03-04-2009 à 20:06:08    

Le nom de l'erreur serait utile.  
 
Mais tu retourne un int** dans "soustraction". Or tu n'as pas fait d'allocation dynamique.
mat3 est donc alloué sur la pile c'est une variable locale qui n'est valable que dans ta fonction. Tu retourne donc un int** sur de la mémoire non allouée.
Il faut que tu alloue ta matrice sur le tas: malloc();

Reply

Marsh Posté le 03-04-2009 à 20:20:38    

et si je ne veux pas allouer ma matrice puisque je connais sa taille, je doit retourné quoi?
si mon code est du genre:

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int** soustraction(int **mat1,int **mat2,int N, int M)
  4. {
  5.    int i,j;
  6.    int mat3[2][2];
  7.         for( i=0; i<N; i++ )
  8.             for( j=0; j<M; j++ )
  9.                 mat3[i][j] = mat1[i][j]-mat2[i][j];
  10. return mat3;
  11. }
  12. main()
  13. {
  14.    int matrice1[2][2], matrice2[2][2];
  15.    int matrice3[2][2];
  16.    int i,j;
  17.    for(i=0;i<2;i++)
  18.       for(j=0;j<2;j++)
  19.       {
  20.          scanf("%d",&matrice1[i][j]);
  21.       }
  22.    for(i=0;i<2;i++)
  23.       for(j=0;j<2;j++)
  24.       {
  25.          scanf("%d",&matrice2[i][j]);
  26.       }
  27.    matrice3=soustraction(matrice1,matrice2,2,2);
  28.    //affichage
  29.       printf("\nLa Differance entre les deux Matrice est:\n\n" );
  30.    for(i=0;i<10;i++)
  31.       for(j=0;j<10;j++)
  32.       {
  33.          printf("%d",matrice3[i][j]);
  34.       }
  35. }


il m'indique une erreur genre: imcompatible type in assignment


Message édité par man_u le 03-04-2009 à 20:26:20
Reply

Marsh Posté le 03-04-2009 à 20:24:56    

De plus un int** != int tab[2][2].
http://forum.hardware.fr/hfr/Progr [...] 8983_1.htm
 
Tu devrais compiler avec les warnings.
 
 Pour ton pb ne retourne pas une matrice mais passe une 3e matrice en paramètre que tu rempliras.


Message édité par Anonymouse le 04-04-2009 à 21:40:19
Reply

Marsh Posté le 03-04-2009 à 20:29:34    

meme si je passe une troisiéme matrice en paramétre apres comment je vais la récupérer?

Reply

Marsh Posté le 03-04-2009 à 20:33:13    

déja chér anonymouse, mon probléme c'est pas l'exemple que vous es écrit , j'ai donner un simple exemple parcontre dans mon probléme que j'ai : JE DOIT RéCUPéRé La MaTRICE EST pas la donner en paramétre! peut tu me dire comment récupéré une matrice ?

Reply

Marsh Posté le 04-04-2009 à 14:16:01    

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef int Matrix2[ 2 ][ 2 ];
  4. typedef int Matrix10[ 10 ][ 10 ];
  5. void soustraction( int* resultat, const int* mat1, const int* mat2, int N, int M )
  6. {
  7.    int i, j;
  8.    for( i=0; i<N; i++ )
  9.        for( j=0; j<M; j++ )
  10.             resultat[ i * M + j ] = mat1[ i * M + j ] - mat2[ i * M + j ];
  11. }
  12. int main()
  13. {
  14.    Matrix10 matrice1;
  15.    Matrix2 matrice2;
  16.    Matrix2 matrice3;
  17.    int i,j;
  18.    for(i=0;i<2;i++)
  19.       for(j=0;j<2;j++)
  20.          scanf("%d",&matrice1[i][j]);
  21.    for(i=0;i<2;i++)
  22.       for(j=0;j<2;j++)
  23.          scanf("%d",&matrice2[i][j]);
  24.    soustraction( matrice3, matrice1, matrice2, 2, 2 );
  25.    //affichage  
  26.       printf("\nLa Differance entre les deux Matrice est:\n\n" );
  27.    for(i=0;i<10;i++)
  28.       for(j=0;j<10;j++)
  29.          printf("%d",matrice3[i][j]);
  30. }


 
Comme je suis de bonne humeur, voila une solution, plus propre. J'ai pas compilé donc modulo une parenthèse manquante, ça devrait marcher.
Quelques remarques :

  • Utiliser des type tableaux c'est assez casse-gueule en C pour un débutant. Par exemple, quelque soit la dimention d'un tableau (int[], int[][], int [][][][][][]...) le type sous-jacent est toujours int*. Un tableau est aussi un poineur, mais c'est tout, jamais un pointeur de pointeur. Et calculer les indices devient vite un calvaire. Le C99 a arrangé tout ça avec le type int[n] avec n variable, mais c'est peu employé.
  • Mets des accolades ou non pour les boucles for d'une ligne, mais soit cohérent, ne les mets pas une fois sur deux.
  • Mettre du texte en français direct dans le code c'est déjà pas propre, essaye au moins de ne pas faire 3 fautes dans une phrase.
  • On est en 2009, code au moins à la norme de 1989 : int main(), et pas juste main(), et utilise const, si si, ça existe aussi en C depuis 89. Mais je te pardonne car je n'ai jamais vu de prof l'enseigner à ses élèves, alors que c'est si pratique.
  • Pourquoi une des matrice est 10x10 et les autres 2x2 ? L'affichage sur 10x10 de matrice3 va planter, je te préviens, j'ai laissé la faute. De toute façon en Math les matrices sont sensées avoir la même taille pour être additionnées.


Message édité par jesus_christ le 04-04-2009 à 14:17:14
Reply

Marsh Posté le 04-04-2009 à 15:18:37    

man_u a écrit :

déja chér anonymouse, mon probléme c'est pas l'exemple que vous es écrit , j'ai donner un simple exemple parcontre dans mon probléme que j'ai : JE DOIT RéCUPéRé La MaTRICE EST pas la donner en paramétre! peut tu me dire comment récupéré une matrice ?


A lire d'urgence :  
 
http://mapage.noos.fr/emdel/notes.htm#param_tab
http://mapage.noos.fr/emdel/notes. [...] er_tableau
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 04-04-2009 à 23:00:20    

Merci Emmanuel Delahaye

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed