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

  FORUM HardWare.fr
  Programmation
  C

  Envois d'un double tableau à une fonction

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Envois d'un double tableau à une fonction

n°2240406
brikdelay
Posté le 15-10-2014 à 20:01:48  profilanswer
 

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" );
    }
 
}

mood
Publicité
Posté le 15-10-2014 à 20:01:48  profilanswer
 

n°2240415
caps lock
Posté le 15-10-2014 à 21:20:57  profilanswer
 

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
n°2240419
gilou
Modérateur
Modzilla
Posté le 15-10-2014 à 23:14:33  profilanswer
 

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é!  --
n°2240422
Trap D
Posté le 16-10-2014 à 00:32:09  profilanswer
 

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

n°2240441
brikdelay
Posté le 16-10-2014 à 12:06:36  profilanswer
 

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
n°2240444
gilou
Modérateur
Modzilla
Posté le 16-10-2014 à 12:41:27  profilanswer
 

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é!  --
n°2240514
Sve@r
Posté le 16-10-2014 à 19:59:30  profilanswer
 

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.

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

  Envois d'un double tableau à une fonction

 

Sujets relatifs
Aide sur une fonction retournat un pointeur sur char. MerciUtiliser getClass() dans une fonction
problème avec jquery et fonction load()Background double
Comment modifier la fonction d'un boutonAide envois de courriel
VBA. Nom de Tableau dynamique.[VBA] - fonction FIND associée à la recherche d'une date
Fonction OnmouseoverVBA - creer tableau dans word
Plus de sujets relatifs à : Envois d'un double tableau à une fonction


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