Appel d'une matrice dans une fonction

Appel d'une matrice dans une fonction - C - Programmation

Marsh Posté le 22-11-2012 à 23:29:44    

Bonjour  :jap:  
 
 
J'ai écrit un petit programme permettant de faire quelques opérations basiques sur les matrices (addition, soustraction, multiplication). Lors de la compilation, il indique une erreur au niveau de l'appel de la fonction saisie indiqué en commentaire : impossible de convertir un int [3][3] en int **
 
Voici le programme :
 

Code :
  1. #include <stdio.h>
  2. #define DIM 3
  3. /*********/
  4. void saisie(int **);
  5. void addition(int **,int **,int **);
  6. void soustraction(int **,int **,int **);
  7. void multiplication(int **,int **,int **);
  8. /*********/
  9. void main()
  10. {
  11. int matA[DIM][DIM], matB[DIM][DIM], matC[DIM][DIM], choix, i,j;
  12. printf("Nous allons entrer les elements de votre premiere matrice\n" );
  13. saisie(matA);/*ERREUR COMPILATION : IMPOSSIBLE DE CONVERTIR UN INT [3][3] EN INT **     */
  14. printf("Nous allons entrer les elements de votre seconde matrice\n" );
  15. saisie(matB);/*ERREUR COMPILATION : IMPOSSIBLE DE CONVERTIR UN INT [3][3] EN INT **      */
  16. printf("Quelle operation voulez-vous faire sur vos matrices ? (addition=1, soustraction=2, multiplication=3)" );
  17. scanf("%d",&choix);
  18. switch (choix)
  19. {
  20.  case 1:{addition(matA,matB,matC);break;}
  21.  case 2:{soustraction(matA,matB,matC);break;}
  22.  case 3:{multiplication(matA,matB,matC);break;}
  23.  default:{printf("Error" );choix=0;}
  24. }
  25. if (choix!=0)
  26. {
  27.  printf("Voici la matrice resultante : \n" );
  28.  for (i=0;i<DIM;i++)
  29.  {
  30.   for (j=0;j<DIM;j++) printf("%d ",matC[i][j]);
  31.   printf("\n" );
  32.  }
  33. }
  34. }
  35. /*************/
  36. void saisie(int mat1[DIM][DIM])
  37. {
  38. int i,j;
  39. for (i=0;i<DIM;i++)
  40.  for (j=0;j<DIM;j++)
  41.   {
  42.   printf("Entrer mat1[%d][%d]: \n",i,j);
  43.   scanf("%d",&mat1[i][j]);
  44.   }
  45. }
  46. void addition(int mat1[DIM][DIM], int mat2[DIM][DIM], int mat3[DIM][DIM])
  47. {
  48. int i,j;
  49. for (i=0;i<DIM;i++)
  50.  for (j=0;j<DIM;j++)
  51.    mat3[i][j]=mat1[i][j]+mat2[i][j];
  52. }
  53. void soustraction(int mat1[DIM][DIM], int mat2[DIM][DIM], int mat3[DIM][DIM])
  54. {
  55. int i,j;
  56. for (i=0;i<DIM;i++)
  57.  for (j=0;j<DIM;j++)
  58.   mat3[i][j]=mat1[i][j]-mat2[i][j];
  59. }
  60. void multiplication(int mat1[DIM][DIM], int mat2[DIM][DIM], int mat3[DIM][DIM])
  61. {
  62. int i,j,k;
  63. for (i=0;i<DIM;i++)
  64.  for (j=0;j<DIM;j++)
  65.  {
  66.   mat3[i][j]=0;
  67.   for (k=0;k<DIM;k++) mat3[i][j]+=mat1[i][k]*mat2[k][j];
  68.  }
  69. }


 
Pourtant, j'ai vérifié et normalement pour les matrices, comme pour les tableaux à une dimension, il faut bien mettre matA en argument de la fonction "saisie" (idem pour matB). Je dois forcément me tromper quelque part. Quelqu'un pourrait-il m'éclairer ? Merci !


Message édité par tropcontent le 23-11-2012 à 13:06:30
Reply

Marsh Posté le 22-11-2012 à 23:29:44   

Reply

Marsh Posté le 22-11-2012 à 23:54:05    

Dans votre prédéclaration, ligne 4, vous indiquez :
 
void saisie(int);
 
Et ensuite, vous la définissez correctement :  
void saisie(int mat1[DIM][DIM])
{
   ...
}
 
Pendant la compilation du "main", le compilateur ne connait que la pré-déclaration (void saisie(int)) et déclare donc que les paramètres sont incorrects.
 
Bonne continuation :)

Reply

Marsh Posté le 23-11-2012 à 13:00:49    

Merci pour votre réponse.
J'ai changé les paramètres du prototypage des fonctions, en mettant int **. Mais il ne compile toujours pas et me dit : "impossible de convertir un int [3][3] en int **. Lorsque j'enlève le prototypage (donc le problème du int **) et que je mets directement les définitions des fonctions avant le main, tout marche très bien. J'écris donc une nouvelle erreur dans le prototypage de mes fonctions. J'ai édité le code de mon premier message pour indiquer les modifications.
Merci !

Reply

Marsh Posté le 24-11-2012 à 19:25:07    

Quelqu'un aurait-il une idée de comment je devrais faire le prototypage des fonctions ?
Merci !  :jap:

Reply

Marsh Posté le 24-11-2012 à 19:48:21    

Utilisez dans la pré-déclaration ce que vous mettez par la suite dans la définition, soit  :  
void saisie(int mat1[DIM][DIM]);
void addition(int mat1[DIM][DIM]);
void soustraction(int mat1[DIM][DIM]);
void multiplication(int mat1[DIM][DIM]);
 

Reply

Marsh Posté le 26-11-2012 à 05:46:39    

Bonjour,
 
 
Effectivement, c'est ce que je pensais faire, pour être sûr que ça marche.
Mais étant donné que dans mes prototypages, j'écris uniquement le type de la variable (pas la variable), par exemple :
void permute(int *, int *);
Je me demandais comment faire dans le cas des matrices. Je pensais que
void saisie(int **);
marcherait mais non. Je suis donc obligé d'écrire :
void saisie(int mat1[DIM][DIM]);
 
?
 
Merci.

Reply

Marsh Posté le 26-11-2012 à 09:29:19    

C'est pas exactement la même chose ça : void foo(int ** T) et ça : void foo (int T[SIZE][SIZE])
 
Un prototype doit avoir exactement les même variables que le corps :  
 
void saisie(int T[DIM][DIM]);
void addition(int T1[DIM][DIM],int T2[DIM][DIM],int T3[DIM][DIM]);
 
etc,etc.
 
Ou alors, changer les types de variables dans tes corps pour passer d'un Tab2D à un pointer sur pointer.


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 28-11-2012 à 22:15:31    

Merci !  :jap:

Reply

Sujets relatifs:

Leave a Replay

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