Passer un tableau de structure en paramètre

Fermé
lagarkane - 20 juil. 2010 à 17:01
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 21 juil. 2010 à 20:10
Bonjour,
J'aimerai passer un tableau de structure à une fonction.

Voici mon appel:

decouperSprite(&posSpriteWait, &posSpriteJump, &posSpriteRun, &posSpriteStand, &posSpriteWalkL, &posSpriteWalkR);


voici le prototype :
void decouperSprite(SDL_Rect posSpriteWait[], SDL_Rect posSpriteWalkR[], SDL_Rect posSpriteWalkL[], SDL_Rect posSpriteRun[], SDL_Rect posSpriteJump[], SDL_Rect posSpriteStand[])


et voilà comment j'accède aux différentes variables de mon tableau de structure:
        posSpriteWait[i].x = MARIO_WIDTH * i;
        posSpriteWait[i].y = MARIO_HEIGHT;
        posSpriteWait[i].w = MARIO_WIDTH;
        posSpriteWait[i].h = MARIO_HEIGHT;


Bref, Ca marche pas bien naturellement, car je m'embrouilles complètement... Pour l'appel de la fonction, je dois passer une adresse, ou un pointeur, ou autre chose?
Et quand je récupère les variables, dans le prototype, je dois récupérer ca dans un pointeur sur un tableau? dans un pointeur sur un pointeur?...
Enfin, pour accéder à tab[i].x par exemple, je dois mettre un point ou un "->"?

C'est la grosse embrouille dans mon cerveau là, je trouve pas la solution ^^"

A voir également:

3 réponses

ghuysmans99 Messages postés 2496 Date d'inscription jeudi 14 juillet 2005 Statut Contributeur Dernière intervention 5 juin 2016 338
21 juil. 2010 à 17:53
Si tu voulais dire ça, alors c'est bon : Donc si par exemple je passe en paramètre un pointeur sur une structure qui contient un tableau de pointeurs vers une structure

Pour expliquer autrement ce que j'avais voulu montrer via des lignes de programme, que tu donnes à une fonction un pointeur vers une structure ou vers un tableau de structures (du moment qu'elles soient du même type), le compilo s'en fiche.
1
ghuysmans99 Messages postés 2496 Date d'inscription jeudi 14 juillet 2005 Statut Contributeur Dernière intervention 5 juin 2016 338
Modifié par ghuysmans99 le 21/07/2010 à 11:15
Définir int mafonction(int* tableauInt); équivaut à int mafonction(int tableauInt[]);. Pour accéder à un élément à partir de mafonction, utilise tableauInt[case].x
Google is your best friend
VB.NET is good ... VB6 is better !
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
21 juil. 2010 à 08:46
Définir int mafonction(int* tableauInt); équivaut à int mafonction(int tableauInt);.
Euh, t'es sûr de ton coup ?
0
ghuysmans99 Messages postés 2496 Date d'inscription jeudi 14 juillet 2005 Statut Contributeur Dernière intervention 5 juin 2016 338
21 juil. 2010 à 11:16
Voilà, c'est modifié. Merci de m'avoir rattrapé, je devais pas être en forme ce jour-là.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
21 juil. 2010 à 20:03
Pas de soucis, l'erreur est humaine. La prochaine fois, tu me corrigeras :-))).
0
ok^^
C'était pas très clair dans ma tête, alors j'ai un peu révisé. :°

Donc si par exemple je passe en paramètre un pointeur sur une structure qui contient un tableau de structure, l'accès se fera comme ca:

Dans le main, l'appel de la fonction:
maFonction(&adresseDeMaStructure);

La fonction:
void maFonction(struct Machin* pointeur)
{
   pointeur->maVariable[1]->x = 0;
}


En fait, si j'ai bien compris, lors de l'appel d'une fonction, pour un tableau ou une structure, on passe son adresse, sans se préoccuper de savoir si dedans il y a 0 ou 36000 tableaux de structures imbriqués^^
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
21 juil. 2010 à 20:10
En fait en C, il est impossible de passer un tableau en paramètre d'une fonction.
Lorsque tu passes un tableau en paramètre d'une fonction, le compilateur le convertira automatiquement en adresse du premier élément du tableau.
De fait le prototype : void toto(int *tab); est pareil que int toto(int tab[]); ou encore que int tab(int tab[NB]) (NB sera ignoré en fait). Dans la fonction appelée, il n'y a alors aucun moyen de savoir la longueur du tableau (sauf pour les tableaux de caractères, qui se finissent par un \0). C'est pour celà qu'on passe également la taille du tableau en paramètre. Donc le prototype est souvent : void toto(const int *tab, const size_t n);
Et en particulier pour les tableaux de structure.
Cdlt,
0