Parametres=> Variables

Math1004 Messages postés 15 Date d'inscription mercredi 10 octobre 2007 Statut Membre Dernière intervention 2 mai 2009 - 5 déc. 2007 à 19:38
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 - 7 déc. 2007 à 11:37
En bref je voudrais pouvoir me servir d un parametre de variable en tant que variable , ou je ne sais trop quel solution :

Exemple : Je possede une structure ou il y a le nom et le prenom . Je souhaite effectué un affichage par ordre alphabetique soit par nom soit par prenom . Etant donné que l algo a effectué est le meme je voudrais pouvoir avoir une fonction "generique" . ( je sais pas trop comment m expliqué :s )

je voudrais obtnir quelque chose du type :

void affichageTrié( Personne , Mot )
{
printf("%s", Personne[1].Mot);  // Selon le mot il accede a MaStructure[i].Nom ou MaStructure[i].Prenom
}

int main( )
{

affichageTrié(MaStructure , "Nom" )  // pour faire un affichage trié par Nom
affichageTrié(MaStrucutre, "Prenom") // pour faire un affichage trié par Prenom avec la meme fonction

}

Voila j espere que c est plus clair avec ca . Je veux pas d explication pour faire l algorithme de tri ( globalement je vois comment faire sans trop de probleme ).
Merci pour votre aide :)

11 réponses

Math1004 Messages postés 15 Date d'inscription mercredi 10 octobre 2007 Statut Membre Dernière intervention 2 mai 2009
5 déc. 2007 à 19:42
Bon je trouve pas comment edité donc bon ^^  dans le main ( ) c est pas vraiment MaStructure c est plutot MonTableauDeStructure . ( Ptite precision pour essayé de rendre comprehensible au maximum ce que je veux ^^ )
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
5 déc. 2007 à 19:54
C'est impossible de faire ce que tu fais..
Fait plutot comme ca:

#define NOM 1
#define PRENOM 2

typedef struct _mastruct
{
char* Nom;
char* Prenom;
}MASTRUCT, *LPMASTRUCT;

void affichageTrie(LPMASTRUCT lpMaStruct, int Membre)
{
switch(Membre)
{
case NOM:
printf("%s", lpMaStruct->Nom);
break;
case PRENOM:
printf("%s", lpMaStruct->Prenom);
break;
}
}

int main(void)
{
MASTRUCT MaStruct;
MaStruct.Nom = "Mon Nom\0";
MaStruct.Prenom = "Mon Prenom\0";
affichageTrie(&MaStruct, NOM);
affichageTrie(&MaStruct, PRENOM);
system("PAUSE");
return 0;
}

Neo_Fr
0
Math1004 Messages postés 15 Date d'inscription mercredi 10 octobre 2007 Statut Membre Dernière intervention 2 mai 2009
5 déc. 2007 à 20:09
oui je c est que ca ne marche pas ce que j ai ecrit.
C'etait pour essayer d explique ce que je veux faire .

En gros j ai fait une fonction qui tri tous les gens de mon tableau de structure par nom et qui m affiche par ordre alphabetique de nom la strucutre entiere . Puis une seconde fonction qui affiche mon tableau de structure par ordre alphabetique de prenom de la strucutre entiere .

En gros si j ai la 1ere personne qui s appelle  Pierre Aad
                et la 2eme personne qui s appelle  Paul Brrih.

Quand j appel ma fonction qui tri par nom  elle va m ecrire Pierre Aad puis Paul Brrih .  Et si j appelle ma fonction qui tri par prenom elle va m ecrire Paul Brrih puis Pierre Aad . Le truc c que l algorithme c est exactement le meme pour le nom et le prenom . La seul chose qui change c est que mes conditions sur la 1ere fonction porte sur MaStructure.Nom et la 2eme sur MaStrucutre.Prenom . Donc je cherche un moyen pour passé un parametre a la fonction et que ma fonction travaille sur MaStructure.X ou X serait le parametre que je lui donne .
Voila j essaye d etre clair mais c pas facil :s
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
5 déc. 2007 à 20:13
Je comprend pas ou est ton pb, tu as juste a passer un pointeur a ta fonction, ainsi tu pourras acceder a tt les membres de ta structure depuis ta fonction.

Neo_Fr
0

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

Posez votre question
Math1004 Messages postés 15 Date d'inscription mercredi 10 octobre 2007 Statut Membre Dernière intervention 2 mai 2009
5 déc. 2007 à 20:59
Non mais le probleme n est pas pour accedé a ma structure .
En gros pour le moment j ai une fonction qui s appelle affichageTriNom et une fonction affichageTriPrenom.
La premiere fais des tris selon les valeurs de MaStruct[i].Nom et la 2eme selon les valeurs de MaStruct[i].Prenom .
Mais effectué un tri alphabetique que se soit pour le nom ou le prenom c exactement le meme algorithme en faite c est juste le champ de ma structure qui est different . Donc ce que je voudrais faire pour allegé mon code c de reussir a faire passé un parametre qui indique si je fais mon tri sur le nom ou prenom du genre je te passe X et tu travail sur MaStruct[i].X où X est soit le nom si je lui ai fourni le nom soit le prenom si je lui fourni le prenom en parametre . Voila j espere etre clair cette fois ci
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
5 déc. 2007 à 23:54
Regarde du côté de offsetof.
C'est une macro qui te donne l'offset d'un membre de ta structure.

Tu pourrais faire un truc du genre (dans l'idée):

typedef struct
{
    char *nom;
    char *prenom;
} PERSONNE;

void display(PERSONNE *pers, int offset)
{
    char *item;

    item = *((char**) (((int) pers) + offset));
    printf("%s\n", item);
}

void main(void)
{
    PERSONNE foo = {"Test", "Un Deux Trois"};
    display(&foo, offsetof(PERSONNE, nom);
    display(&foo, offsetof(PERSONNE, prenom);
}

Pour la fonction de tri, ben c'est la même chose.

[www.agilicom.fr AGILiCOM]
Savon
0
Math1004 Messages postés 15 Date d'inscription mercredi 10 octobre 2007 Statut Membre Dernière intervention 2 mai 2009
6 déc. 2007 à 19:28
__offsetof__ was not declared in this scop :s  j ai recopier ce que tu a mis en incluant #include <stddef.h>  #include <stdio.h> et cela ne marche pas :-( deja que je n ai jamais fait/utilisé de macro :s la me sors une erreur que je ne comprend meme pas :(
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
6 déc. 2007 à 22:08
#define offsetof(s,m)   (size_t)&(((s *)0)->m)

Sinon, peux-tu me dire sous quel environnement tu travailles.

[www.agilicom.fr AGILiCOM]
Savon
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
6 déc. 2007 à 22:40
Oups...
Il y a une erreur dans le code que je t'ai mis ci-dessus:
void main(void)
{
    PERSONNE foo = {"Test", "Un Deux Trois"};
    display(&foo, offsetof(PERSONNE, nom));         //Manquait une )
    display(&foo, offsetof(PERSONNE, prenom));   //Manquait une )
}



Testé sous VS2005 express, et VS6, pas de problème

AGILiCOMSavon
0
Math1004 Messages postés 15 Date d'inscription mercredi 10 octobre 2007 Statut Membre Dernière intervention 2 mai 2009
6 déc. 2007 à 22:57
ahh merci ca marche sous devc++ . bon ba je vais essayé de me servir de ca pour faire tous mes tris avec une seul fonction  ( meme si je vois pas encore a quoi sa va me servir enfaite mais bon ^^  ) mercii et je vous repond si j y arrive pas ^^. 
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
7 déc. 2007 à 11:37
Ca va te permettre d'avoir une fonction unique pour trier sur des chaines de caractères.
Au lieu de lui passer le nom de l'élement sur lequel trier (ce qui est impossible), tu lui passes l'offset de l'élément dans ta structure.
Comme ça, une seule fonction, et un tri sur l'éléement placé en telle position dans la strucutre. Attention cependant, il n'y a pas de vérification de type. Tu dois bien faire attention de trier sur des chaines de carctères!

Amuse-toi bien!

AGILiCOMSavon
0
Rejoignez-nous