Envois d'un double tableau à une fonction

Envois d'un double tableau à une fonction - C - Programmation

Marsh Posté le 15-10-2014 à 20:01:48    

Bonsoir,  
Je construit un programme destiné à calculer le determinant d'une matrice, et pour commencer je crée une fonction qui remplit automatiquement une matrice que je crée avec des valeurs randoms.
Le code ci-dessous fonctionne, pourtant j'ai un warning qui refuse de partir :
 

Citation :

warning: passing argument 1 of 'remplit_matrice' from incompatible pointer type [enabled by default]|
note: expected 'int *' but argument is of type 'int (*)[3]'|


 
Pourtant ça fonctionne très bien, c'est la seule solution que j'ai trouvé pour envoyer à une fonction une matrice carrée de taille inconnue.
Une idée, un commentaire ?  :)  
 
Merci !
 

Citation :


int main()
{
 int matrice[3][3];
 remplit_matrice(matrice,3);
 
return 0;
}
 
void remplit_matrice(int *matrice, int n){
 
    int i,j;
 
    int *pointeur_matrice = matrice;
 
 
 
    srand(time(NULL));
 
    for (i=0;i<n;i++) {
 
        for (j=0;j<n;j++) {
 
            *(pointeur_matrice+(i*n)+j) = rand()%10;
            printf("%d",*(p_mat+(i*n)+j));
 
        }
     printf("\n" );
    }
 
}

Reply

Marsh Posté le 15-10-2014 à 20:01:48   

Reply

Marsh Posté le 15-10-2014 à 21:20:57    

Même si je n'aime pas vraiment ce site, commences par lire cet article :  
http://fr.openclassrooms.com/infor [...] teurs-en-c
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. void remplit_matrice(int *matrice, int n){
  5.     int i,j;
  6.     int *pointeur_matrice = matrice;
  7.     srand(time(NULL));
  8.     for (i=0;i<n;i++) {
  9.         for (j=0;j<n;j++) {
  10.             *(pointeur_matrice+(i*n)+j) = rand()%10;
  11.             printf("%d",*(pointeur_matrice+(i*n)+j));
  12.         }
  13.      printf("\n" );
  14.     }
  15. }
  16. int main()
  17. {
  18. int matrice[3][3];
  19. remplit_matrice(*matrice,3);
  20. return 0;
  21. }


Message édité par caps lock le 15-10-2014 à 21:35:52
Reply

Marsh Posté le 15-10-2014 à 23:14:33    

brikdelay, ta méthode est bonne, mais c'est pour du C de l'age de pierre.  
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. void remplit_matrice(int *matrice, int n)
  5. {
  6.     int i, j;
  7.     for (i = 0; i < n; i++) {
  8.         for (j = 0; j < n; j++) {
  9.             *(matrice + (i*n) + j) = rand()%10;
  10.         }
  11.     }
  12. }
  13. int main(int argc, char *argv[])
  14. {
  15.     int matrix[3][3];
  16.     srand(time(NULL));
  17.     remplit_matrice((int *)matrix, 3);
  18.     int i, j;
  19.     for (i = 0; i < 3; i++) {
  20.         for (j = 0; j < 3; j++) {
  21.             printf("%d ", matrix[i][j]);
  22.         }
  23.         printf("\n" );
  24.     }
  25.     return 0;
  26. }


Si tu veux approfondir la question, pour ce type de C, tu as cette excellente page en anglais: http://www.geeksforgeeks.org/pass- [...] rameter-c/
 
Depuis, on a fait mieux avec le C99, ou tu peux écrire:

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. // la taille doit apparaitre en premier ici
  5. void remplit_matrice(int n, int matrice[n][n])
  6. {
  7.     int i, j;
  8.     for (i = 0; i < n; i++) {
  9.         for (j = 0; j < n; j++) {
  10.             matrice[i][j] = rand()%10;
  11.         }
  12.     }
  13. }
  14. int main(int argc, char *argv[])
  15. {
  16.     int matrix[3][3];
  17.     srand(time(NULL));
  18.     remplit_matrice(3, matrix);
  19.     int i, j;
  20.     for (i = 0; i < 3; i++) {
  21.         for (j = 0; j < 3; j++) {
  22.             printf("%d ", matrix[i][j]);
  23.         }
  24.         printf("\n" );
  25.     }
  26.     return 0;
  27. }


 
C99, ça date suffisamment pour qu'on puisse supposer qu'un compilo normal l'implémente.
 
 
A+,


Message édité par gilou le 15-10-2014 à 23:51:23

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 16-10-2014 à 00:32:09    

void remplit_matrice(int n, int matrice[][n]) suffit il me semble, en tout cas ça fonctionne avec x86_64-w64-mingw32-gcc.exe

Reply

Marsh Posté le 16-10-2014 à 12:06:36    

Merci beaucoup gilou, ton lien explique toute les solutions possibles, au moins je suis fixé :love:
Je rentre en école d'ingé info, j'ai envie de prendre les meilleures habitudes donc j'aurais voulu savoir, est-ce que l'implémentation en c99 est aussi efficace que celle "de l'âge de pierre" en c89 ?
Dans le tuto d'open classroom qui m'a appris les bases du C, il était justement écris qu'il ne fallait pas utiliser les tableaux à taille variable et privilégier l'allocation dynamique, et j'ai aussi entendu ça en TD, donc j'aimerai bien un avis argumenté sur la question :jap:
Parce que c'est bien joli les pointeurs de tableau mais si je peux éviter de passer par la ..  :wahoo:

 
Citation :

void remplit_matrice(int n, int matrice[][n]) suffit il me semble, en tout cas ça fonctionne avec x86_64-w64-mingw32-gcc.exe

 

c'est du c99 :o

Message cité 2 fois
Message édité par brikdelay le 16-10-2014 à 12:10:16
Reply

Marsh Posté le 16-10-2014 à 12:41:27    

brikdelay a écrit :

Dans le tuto d'open classroom qui m'a appris les bases du C, il était justement écris qu'il ne fallait pas utiliser les tableaux à taille variable et privilégier l'allocation dynamique, et j'ai aussi entendu ça en TD, donc j'aimerai bien un avis argumenté sur la question :jap:

Et de nos jours, en C++, on t'apprends tout le contraire [:zest:4] avoir des objets alloués automatiquement plutôt que dynamiquement. C'est plus rapide (en terme d'accès) et il n'y a pas a gérer la destruction.
Bon, bien sur, pour tous les objets dont la taille varie au cours du temps, ou qui sont partagés, c'est l'allocation dynamique qui est de règle.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 16-10-2014 à 19:59:30    

Salut
 

brikdelay a écrit :

Je rentre en école d'ingé info, j'ai envie de prendre les meilleures habitudes donc j'aurais voulu savoir, est-ce que l'implémentation en c99 est aussi efficace que celle "de l'âge de pierre" en c89 ?
Dans le tuto d'open classroom qui m'a appris les bases du C, il était justement écris qu'il ne fallait pas utiliser les tableaux à taille variable et privilégier l'allocation dynamique, et j'ai aussi entendu ça en TD, donc j'aimerai bien un avis argumenté sur la question :jap:


Les choses évoluent avec le temps. A une époque la mémoire était coûteuse et les machines lentes. Et maintenant c'est tout le contraire. Quand je pense que j'ai connu l'oric avec 8ko de RAM et que j'étais fasciné quand j'ai vu arriver l'oric Athmos qui avait 16k et que maintenant j'ai un ordi 8 processeurs avec 16Go de RAM et une carte vidéo de 3Go...
 

brikdelay a écrit :

Parce que c'est bien joli les pointeurs de tableau mais si je peux éviter de passer par la ..  :wahoo:


Tu ne pourras pas. Déjà d'une part parce qu'une fonction qui doit modifier une variable qu'elle ne possède pas ne peut le faire que si elle connait l'adresse de cette variable, adresse que l'appelant lui envoie et qu'elle stockera de son coté dans un pointeur. Et d'autre part si tu passes une structure à une fonction, structure pouvant contenir plusieurs centaines d'octets, vaut mieux alors passer l'adresse de la structure plutôt que la structure elle-même. En effet, le passage de paramètres se faisant toujours par recopie, vaut mieux recopier 4 octet plutot que plusieurs centaines. Surtout si cette opération est faite plusieurs fois dans une boucle...
 
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

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