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

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1266226
Profil sup​primé
Posté le 14-12-2005 à 11:57:16  answer
 

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?

mood
Publicité
Posté le 14-12-2005 à 11:57:16  profilanswer
 

n°1266271
db__
spécialiste de l'à peu près
Posté le 14-12-2005 à 12:43:07  profilanswer
 

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.

n°1266359
in_your_ph​ion
Posté le 14-12-2005 à 14:21:59  profilanswer
 


 
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
n°1266433
Sve@r
Posté le 14-12-2005 à 15:47:35  profilanswer
 

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
n°1266680
Emmanuel D​elahaye
C is a sharp tool
Posté le 14-12-2005 à 19:12:10  profilanswer
 


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/
n°1266684
Emmanuel D​elahaye
C is a sharp tool
Posté le 14-12-2005 à 19:16:30  profilanswer
 

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/
n°1267001
MEI
|DarthPingoo(tm)|
Posté le 15-12-2005 à 10:31:51  profilanswer
 

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 |
n°1267152
in_your_ph​ion
Posté le 15-12-2005 à 12:42:10  profilanswer
 

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]


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

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

 

Sujets relatifs
Code C question !Question sécurité session générale
Question sur XML avec C++Tri dans un tableau (débutant inside)
[C#, Winforms] Passage d'un contrôle de type 'Form' en paramètre.probleme avec tableau
plusieurs connections TCP clientes => autant de ports différents ?initialiser un tableau 2D ds le main
Utilisation de plusieurs servlets 
Plus de sujets relatifs à : [C] question passage d'un tableau a plusieurs dim en parametre


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