Envois d'un double tableau à une fonction - C - Programmation
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 :
|
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 :
|
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 :
|
C99, ça date suffisamment pour qu'on puisse supposer qu'un compilo normal l'implémente.
A+,
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
Marsh Posté le 16-10-2014 à 12:06:36
Merci beaucoup gilou, ton lien explique toute les solutions possibles, au moins je suis fixé
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
Parce que c'est bien joli les pointeurs de tableau mais si je peux éviter de passer par la ..
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
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 |
Et de nos jours, en C++, on t'apprends tout le contraire 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+,
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 ? |
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 .. |
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...
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 :
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 !
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" );
}
}