question passage d'un tableau a plusieurs dim en parametre [C] - C - Programmation
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.
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 :
|
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 :
|
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 :
|
les pros du C ici, dont je ne fais pas partie, te dirons sans doute si je t'ai dis une enorme connerie
, 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.
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
|
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]
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]) |
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. |
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...
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. ![]()
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. |
oh yeah ![[:un flip par boobax] [:un flip par boobax]](https://forum-images.hardware.fr/images/perso/un flip par boobax.gif)
Marsh Posté le 14-12-2005 à 11:57:16
bonjour,
j'aimerais faire ceci
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?