[C] permutation des éléments d'une structure

Résolu/Fermé
isley Messages postés 20 Date d'inscription jeudi 21 août 2008 Statut Membre Dernière intervention 14 novembre 2009 - 27 nov. 2008 à 11:33
isley Messages postés 20 Date d'inscription jeudi 21 août 2008 Statut Membre Dernière intervention 14 novembre 2009 - 27 nov. 2008 à 23:07
Bonjour,
Voici mon problème.
J'ai une structure contenant 4 entiers, et je cherche à permuter 2 à 2 les éléments de cette structure.
Je souhaite faire appel pour cela à la fonction permute, dont voici le code :

void permute (int *a, int *b)
{
int s;
s= *a;
*a=*b;
*b=s;
}

Pouvez-vous m'aider à démarrer, s'il vous plait?
merci d'avance

5 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
27 nov. 2008 à 15:05
Salut.
Crazyghandi, tu dit beaucoup de bétisses. '->' ne sert pas que pour les listes chaîné, il sert à accéder au membre d'une structure à partir de son pointeur. Exemple :
struct A a,*b;
Pour accéder au membre i de a et b, il faut faire : a.i=3;b->i=0;
Ensuite, la fonction permute de Isley est bonne, la tienne fausse : elle ne permute rien du tout. En C le standard est le passage par copie. Si tu as int f(int a); lorsque tu appel cette fonction f(b), tu met la valeur de b dans le a de la fonction, et si tu modifie le a tu ne modifie pas b.
Avec les pointeurs, c'est pareil. Considère le code suivant :
int a,*b,*c;
*b=a; b est un pointeur pointant vers un entier contenue dans a.
Tu as une fonction void permute((int*) n1,(int*) n2)
Lorsque tu l'appel :
permute(b,c) tu copie b dans n1, c'est à dire l'adresse de a.
Si tu fait n1=n2, tu met l'adresse pointé par c dans n1, mais tu ne modifie pas a.
Si tu fait *n1=*n2; Tu mets la valeur pointé par c dans celle pointé par n1, donc par b (car c'est la même). Donc, tu modifie a.
Avec les pointeurs, il faut bien faire attention à ce que l'on manipule. Bon, je passe la fonction main, qui contient un nombre important de conneries. Un bon exemple de ce qu'il ne faut pas faire.
1
crazyghandi Messages postés 312 Date d'inscription vendredi 9 novembre 2007 Statut Membre Dernière intervention 4 octobre 2011 19
27 nov. 2008 à 12:00
struct entiers {
int *n1;
int *n2;
int *n3;
int *n4;
};

struct entiers liste;

void permute(int *a, int *b) {
int *tmp;
tmp = a;
a = b;
b = tmp;
return 0;
}

void main (void) {
printf ("\n rentrez un entier :");
scanf("%d",n1);
printf ("\n rentrez un entier :");
scanf("%d",n2);
printf ("\n rentrez un entier :");
scanf("%d",n3);
printf ("\n rentrez un entier :");
scanf("%d",n4);
permute (liste.n1,liste. n2);
permute (liste.n3,liste.n4);
printf(`\n nouvel ordre : %d %d %d %d",liste.n1,liste.n2,liste.n3,liste.n4);
return 0;
}
0
isley Messages postés 20 Date d'inscription jeudi 21 août 2008 Statut Membre Dernière intervention 14 novembre 2009
27 nov. 2008 à 13:07
Merci pour ta réponse rapide crazyghandi

Cependant, j'ai quelques questions au sujet des pointeurs :
- dans la fonction permute, pourquoi ne réutilise t-on pas les pointeurs (comme dans la fonction que j'ai mise dans mon post)?
- pourquoi est-ce qu'on ne fait pas appel à l'opérateur ->, que l'on rencontre si souvent dans les structures?

Merci d'avance pour ton aide
0
crazyghandi Messages postés 312 Date d'inscription vendredi 9 novembre 2007 Statut Membre Dernière intervention 4 octobre 2011 19
27 nov. 2008 à 13:10
alors dans la fonction on appelle deja les deux variable en tant que pointeurs sur l'addresse de la variable envoyee (les liste.b) donc pas besoin de les repointer

ensuite on uilise l'operateur . pour le champ d'une structure , loperateur -> etant reserve aux liste chainees
qui sont un systeme de liste avec allocation memoire
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
isley Messages postés 20 Date d'inscription jeudi 21 août 2008 Statut Membre Dernière intervention 14 novembre 2009
27 nov. 2008 à 23:07
Merci beaucoup pour la clarté et la rapidité de ta réponse.
J'ai vraiment bien compris, merci encore :D
0