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

Résolu
isley Messages postés 20 Date d'inscription   Statut Membre Dernière intervention   -  
isley Messages postés 20 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Contributeur Dernière intervention   1 299
 
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   Statut Membre Dernière intervention   19
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   19
 
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   Statut Membre Dernière intervention  
 
Merci beaucoup pour la clarté et la rapidité de ta réponse.
J'ai vraiment bien compris, merci encore :D
0