[C] question passage d'un tableau a plusieurs dim en parametre

question passage d'un tableau a plusieurs dim en parametre [C] - C - Programmation

Marsh Posté le 14-12-2005 à 11:57:16    

bonjour,
j'aimerais faire ceci
 

Citation :


main()
{
 float poids[TAILLE*TAILLE][NBLETTRES];
 initialiserpoids(poids);
}
 
avec comme fonction
 
void initialiserpoids(int *poids)
{
 blablabla...
}


 
or j'ai un message d'erreur a l appel de la fonction initialiser poids, message derreur que je n'est pas si poids est a une dimension.
On ne peut pas mettre un tableau en deux dimensions en parametres?

Reply

Marsh Posté le 14-12-2005 à 11:57:16   

Reply

Marsh Posté le 14-12-2005 à 12:43:07    

Bonjour
Comme paramètre, il est possible d'envoyer une valeur ou un pointeur.
Il est tout à fait possible d'envoyer un pointeur sur un tableau à deux dimensions en considérant qu'il s'agit d'un tableau de pointeur sur des tableau à une dimension.
void initialiserpoids (float **poids) devrait mieux convenir.
déclarer un tableau de float et pointer dessus en considérant que c'est des int devrait normalement provoquer une erreur à la compilation ou au moins un clignotant.

Reply

Marsh Posté le 14-12-2005 à 14:21:59    


 
De toute manière tu devrais faire int **poids et non int *poids. Et meme ca, ca ne marcherait pas. Tu ne peux pas passer un tableau a deux dimensions en C sans lui dire au moins combien fait la largeur de ton tableau. Je crois que c'est du au fait que quand ton tableau est a une dimension, le compilateur y accede par  

Code :
  1. tab[i ]


c'est a dire qu'il va se décaler de i dans les cases memoires à partir du début de ton tablo.
En revanche, lorsque ton tableau est a deux dimensions, le compilateur accede aux elements de ton tablo tab[i][j] par

Code :
  1. tab[j + sx*i]


où j est l'index des colonnes, i celui des lignes, et sx est la largeur de ton tableau. C'est pourquoi il lui faut connaitre sx : s'il veut acceder au deuxième element de la troisième lignes par exemple, le compilateur doit d'abord se décaler de sx*3 cases (donc trois lignes), puis se déplacer de deux. Donc en fait je crois que ta fonction devrait etre, si tu veux rester en tableaux :

Code :
  1. void initialiserpoids(float *poids[NBLETTRES])


 
les pros du C ici, dont je ne fais pas partie, te dirons sans doute si je t'ai dis une enorme connerie  :D , mais je crois pas (enfin j'espere pas). Au fait si tu passes un tablo de float, ta fonction serait mieux en float comme je l'ai ecrit.

Message cité 1 fois
Message édité par in_your_phion le 14-12-2005 à 14:45:34
Reply

Marsh Posté le 14-12-2005 à 15:47:35    

in_your_phion a écrit :

De toute manière tu devrais faire int **poids et non int *poids. Et meme ca, ca ne marcherait pas. Tu ne peux pas passer un tableau a deux dimensions en C sans lui dire au moins combien fait la largeur de ton tableau. Je crois que c'est du au fait que quand ton tableau est a une dimension, le compilateur y accede par  

Code :
  1. tab[i ]


c'est a dire qu'il va se décaler de i dans les cases memoires à partir du début de ton tablo.
En revanche, lorsque ton tableau est a deux dimensions, le compilateur accede aux elements de ton tablo tab[i][j] par

Code :
  1. tab[j + sx*i]


où j est l'index des colonnes, i celui des lignes, et sx est la largeur de ton tableau. C'est pourquoi il lui faut connaitre sx : s'il veut acceder au deuxième element de la troisième lignes par exemple, le compilateur doit d'abord se décaler de sx*3 cases (donc trois lignes), puis se déplacer de deux. Donc en fait je crois que ta fonction devrait etre, si tu veux rester en tableaux :

Code :
  1. void initialiserpoids(float *poids[NBLETTRES])



 
Excellent - T'as tout à fait compris le pb du décalage des lignes.
Pour résumer, quand on a un tableau à "n" dimensions à passer à une fonction, on est obligé de lui spécifier les tailles des "n -1" dernières dimensions et on peut remplacer la 1ère par un "*"
 
Ex: si tu as un "int tab[10][100][1000]" et que tu passes "tab" à ta fonction, ta fonction recevras un "int *pt[100][1000]

Message cité 1 fois
Message édité par Sve@r le 14-12-2005 à 15:48:12
Reply

Marsh Posté le 14-12-2005 à 19:12:10    


Ben oui, il faut les dimensions (on peut néanmoins omettre la plus à gauche);

void initialiserpoids(float poids[TAILLE*TAILLE][NBLETTRES])


ou

void initialiserpoids(float poids[][NBLETTRES])


Message édité par Emmanuel Delahaye le 15-12-2005 à 11:51:02

---------------
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/
Reply

Marsh Posté le 14-12-2005 à 19:16:30    

db__ a écrit :

Comme paramètre, il est possible d'envoyer une valeur ou un pointeur.


Pas clair. En C, il n'y a que des valeurs... Une adresse est une valeur comme une autre.

Citation :

Il est tout à fait possible d'envoyer un pointeur sur un tableau à deux dimensions en considérant qu'il s'agit d'un tableau de pointeur sur des tableau à une dimension.
 
void initialiserpoids (float **poids) devrait mieux convenir.


Ah oui, t'as essayé ? Marche pas du tout dans ce cas là. Comment la fonction pourrait-elle calculer les déplacements ? On est dans le cas d'un tableau plat à 2 dimensions, pas d'un tableau de tableaux...
 


---------------
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/
Reply

Marsh Posté le 15-12-2005 à 10:31:51    

Le C impose de donné la taille de 2e dimension (et suivante je pense dans le cas général) du tableau dans la signature, y'a rien de plus et c'est tout. :)


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 15-12-2005 à 12:42:10    

Sve@r a écrit :

Excellent - T'as tout à fait compris le pb du décalage des lignes.
Pour résumer, quand on a un tableau à "n" dimensions à passer à une fonction, on est obligé de lui spécifier les tailles des "n -1" dernières dimensions et on peut remplacer la 1ère par un "*"
 
Ex: si tu as un "int tab[10][100][1000]" et que tu passes "tab" à ta fonction, ta fonction recevras un "int *pt[100][1000]


 
oh yeah [:un flip par boobax]

Reply

Sujets relatifs:

Leave a Replay

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