Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1148 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Probléme avec les matrices

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probléme avec les matrices

n°1869362
man_u
Posté le 03-04-2009 à 19:51:49  profilanswer
 

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

mood
Publicité
Posté le 03-04-2009 à 19:51:49  profilanswer
 

n°1869364
Anonymouse
Posté le 03-04-2009 à 20:06:08  profilanswer
 

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();

n°1869368
man_u
Posté le 03-04-2009 à 20:20:38  profilanswer
 

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
n°1869369
Anonymouse
Posté le 03-04-2009 à 20:24:56  profilanswer
 

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
n°1869370
man_u
Posté le 03-04-2009 à 20:29:34  profilanswer
 

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

n°1869372
man_u
Posté le 03-04-2009 à 20:33:13  profilanswer
 

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 ?

n°1869479
jesus_chri​st
votre nouveau dieu
Posté le 04-04-2009 à 14:16:01  profilanswer
 

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
n°1869497
Emmanuel D​elahaye
C is a sharp tool
Posté le 04-04-2009 à 15:18:37  profilanswer
 

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/
n°1869585
man_u
Posté le 04-04-2009 à 23:00:20  profilanswer
 

Merci Emmanuel Delahaye


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Probléme avec les matrices

 

Sujets relatifs
Problème compilation serveur CORBArecuperation d'IP sur serveur distant, probleme de compteur
problème de recordset ou de querydefProbleme de formulaires PHP
Probleme de connexion JavaMySQL - connection PHP/MySQL - problème de socket ?
Problème d'écriture et de répertoiresOpérations matrices problème structure pointeur
Probleme avec des matrices de transformation 3D ... 
Plus de sujets relatifs à : Probléme avec les matrices


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR