Langage C: Problème de retour de Pointeur dans une fonction

loic911 Messages postés 24 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 10 mai 2005 - 29 janv. 2005 à 15:29
vdust Messages postés 43 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 14 mars 2007 - 30 janv. 2005 à 21:14
Salut
J'aimerais bien renvoyer l'endroit d'un pointeur sur un tableau a deux dimension à une autre fonction
exemple:


void main
{
fct1 (&tab[0][0});
fct2 (&tab[0][0});
}


void fct1 (int *p)
{
mon pointeur P2 se déplace jusqu'a un endroit X (par exemple tab[2][5]) à partir du pointeur P
}
void fct2 ()
{
Je réutilise l'endroit du pointeur P2 (par exemple tab[2][5]) de la fonction 1 pour vérifier des conditions...
J'utilise le même tableau
}


Je peux faire ca qu'en C donc ca sert a rien de me proposer des alternative
J'avais penser a un "return" dans la première fonction mais ca va pas

4 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
29 janv. 2005 à 17:27
Ca veut rien dire "l'endroit d'un pointeur". Personnellement je
comprend pas bien ce que tu veux. Pour passer des tableaux a deux
dimensions, il faut définir tes fonctions comme ca:




void fct1 (int p[][4]) // 4 correspondant a la taille de la deuxième dimension
{
//et la tu fais ce que tu veux avec p.
}



void main
{

int tab[10][4];
fct1 (tab);
fct2 (tab);
}
0
vdust Messages postés 43 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 14 mars 2007
29 janv. 2005 à 22:27
Salut !



Commençons par les définitions (je pense que tu les connais, mais c'est
toujours utile de le rappeler) : un pointeur vers un objet est une
variable qui contient l'adresse de cet objet. Dans ton cas, l'objet est
un tableau. A la création du tableau, par exemple

int tab[10][4];


l'identifiant tab
est un pointeur vers ton tableau 4x10. Ainsi, lorsque tu appelles ta première fonction, tu peux lui passer directement tab ou bien, comme tu le fais déjà &tab[0][0] (ça reviens au même :).

Dans le cas qui t'intéresses, tu souhaites passer à la deuxième fonction un pointeur vers la donnée à l'adresse &tab[x][y]

Il faut pour cela de passer en argument à fct2 ce pointeur. La
fonction fct1 doit donc retourner ce pointeur. Quelques modifications
de la fonction 1 sont nécessaires :



int* fct1(int* p)

{



int x, y; // coordonnées de l'élément cherché





//Ici, tu fais les opérations nécessaires pour récupérer

//x et y, les coordonnées de l'élément tab[x][y]



return &tab[x*taille_dim_2 + y]; //ta fonction renvoie

//un pointeur vers l'élément cherché

//très important : la fonction ne connais pas la taille de la de la
deuxième dimension. Il faut donc soit la définir globalement, soit la
définir globalement, soit la passer en argument

//Ou bien, comme le signalait luthor, tu utilises à la place de 'int* p', 'int p[][taille_dim_2]', et tu retourne &tab[x][y]



}



Tu n'as plus qu'à récupérer ce pointeur et à le passer à ta deuxième fonction



int main

{

int* ret_fct1;

int tab[X][Y];



ret_fct1 = fct1(tab);

fct2(ret_fct1);

}



Voilà... Essaie quand même de chercher des docs (google : "pointeur
langage c") sur le fonctionnement des pointeurs, leurs avantages et
leurs inconvénients : c'est un outil très utile et même indispensable
(je me demande comment je faisais sans avant... :). Je pense que si tu
comprends exactement ce qu'est un pointeur, ton problème se résoudra de
lui-même.



bye !


-- Virtual Dust --
0
bayeto Messages postés 224 Date d'inscription mardi 12 août 2003 Statut Membre Dernière intervention 18 octobre 2010
29 janv. 2005 à 22:50
Mouais mais pour un tableau à deux dimensions je prefere un truc du genre:
void foo(int **tab); ou void foo(int *tab[]);

void fct1 (int *p[])
{
//faire des trucs avec p[] ou meme p[][];
}
0
vdust Messages postés 43 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 14 mars 2007
30 janv. 2005 à 21:14
bayeto : tout dépend comment ton tableau est créé. Car avec int *p[] ou
int **p, tu passes un tableau de pointeurs. Or, tab[x][y] ne créer pas
de tableau de pointeur, et passer tab créé comme suit (ce que veut
faire loic apparemment)

int tab[10][4]

à la fonction fct1(int *p[]) génère l'erreur suivante :



error C2664: 'fct1' : cannot convert parameter 1 from 'int [10][4]' to 'int *[]'



De plus, dans ton exemple, bayeto, tes lignes se retrouvent séparées en mémoire, ce qui rend leur parcours plus tortueux.


-- Virtual Dust --
0