Structure dans fonction

Fermé
romain78 - 30 oct. 2012 à 12:01
[Dal] Messages postés 6193 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 juillet 2024 - 30 oct. 2012 à 15:26
Bonjour,

J'ai une petite quesiton au niveau des structures dans les fonction

Je souhaite faire une sorte de repertoire pour m'entrainer un peu sur tout ce qui est structure et fonction.

J'ai donc une structure
typedef struct utilisateur
{ char nom[30];
   char prenom[30];
   int age;
}

J''en ai ensuite fait un tableau de structure ainsi:
utilisateur carnet[10];


Maintenant j'aimerai faire un menu qui puisse lorsque je selection "Ajouter" par exemple crée une structure dans le tableau de structure a chaque fois que je selectionne ajouter donc saisie par un utilisateur donc des printf et des gets utilisateur.nom, utilisateur.prenom..

J'ai donc quelques questions. Comment mettre une fonction en place qui, comme je l'ai ennoncé crée une structure utilisateur qui va entrer dans carnet.
car si dans ma fonction je declare un objet de ma structure comme par exemple : utilisateur pers, il va y avoir un probleme a chaque fois que je vais vouloir créer une nouvelle structure non ?
Ce qui serait bien c'est de pouvoir incrémenter en fait mais j'ia beau chercher, je ne trouve pas le bon angle.

Merci d'avoir pris le temps de lire, n'hesitez pas a poser des questions si je n'ai pas été assez clair


A voir également:

3 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
30 oct. 2012 à 13:29
Bonjour,

Pour info, tu pourrais également utiliser un arbre plutôt qu'une structure.
Et pour conseil, mets une majuscule à tes noms de structure (cela évite confusion entre type et variable).
Sinon avec le tableau, voici un exemple de ce que tu pourrais faire :

static void videBuffer(void) {
   int c;
   while( (c=getchar()) != '\n' && c!=EOF );
}
void ajouter(Utilisateur *carnet, int *nbUser) {
   printf("...");
   if (fgets(carnet[*nbUser].nom, sizeof *carnet.nom, stdin)) {
      char *p=strchr(carnet[*nbUser].nom,'\n');
      if(p!=NULL)
          *p='\0';
      else
          videBuffer();

    ...

   (*nbUser)++;
}
      
int main(void) {
   Utilisateur carnet[10];
   int nbUser=0;
   /*boucle*/
   /*menu*/
      ajouter(carnet,&nbUser);
   /*fin boucle*/
    return 0;
}


Je n'ai pas testé le code, donc attention, il y a peut-être des erreurs. Mais le principe reste là.
0
gibs1 Messages postés 1 Date d'inscription mardi 30 octobre 2012 Statut Membre Dernière intervention 30 octobre 2012
Modifié par gibs1 le 30/10/2012 à 14:15
(Je me suis inscrit donc normal si je n'ai pas le même pseudo)

OK donc si je ne me trompe pas tu as utilisé de la dynamique non ?
Je n'ai pas encore eu le temps de me pencher dessus donc j'aimerai savoir si c'est obligatoire

Ensuite, j'aimerai en savoir un peu plus sur l'arbre, pourrais tu me définir le concept en quelques mots pour que je puisse faire plus de recherche
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
30 oct. 2012 à 14:42
Où vois-tu de la dynamique ? Et qu'entends-tu par "dynamique" ?
Ne confondrais-tu pas avec allocation dynamique ? Si c'est le cas, à aucun endroit j'en ai utilisé. J'ai tout simplement repris ta structure où l'allocation des variables est statiques.

Pour l'arbre, je pensais à l'utilisation d'une liste doublement chaînée : https://forums.commentcamarche.net/forum/affich-37604399-liste-doublement-chainee

Cdlt,
0
[Dal] Messages postés 6193 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 juillet 2024 1 090
Modifié par [Dal] le 30/10/2012 à 15:29
Salut gibs1,

fiddy t'a donné tous les éléments dans son code d'exemple, analyse le bien.

Je voulais juste attirer ton attention sur ton typedef et la façon dont tu le déclares et tu l'utilises.

typedef struct utilisateur   
{ char nom[30];   
   char prenom[30];   
   int age;   
}   
utilisateur carnet[10];

est incorrect :

- il manque l'identifiant du type créé et un ; à la fin du typedef
- la déclaration de carnet utilise l'étiquette du struct, ce qui ne va rien donner (sauf à déclarer struct utilisateur carnet[10];, mais alors, cela ne sert à rien de créer un typedef).

Donc, pour créer un typedef de struct, il faut normalement une étiquette identifiant le struct, et un nom pour le type créé :
typedef struct StructUtilisateur   
{ char nom[30];   
   char prenom[30];   
   int age;   
} TypeUtilisateur;   
TypeUtilisateur carnet[10];

Ce sont deux choses différentes, même si on peut utiliser le même identifiant pour éviter de se casser la tête :
typedef struct Utilisateur   
{ char nom[30];   
   char prenom[30];   
   int age;   
} Utilisateur;   
Utilisateur carnet[10];

On peut aussi se passer de l'étiquette de struct :
typedef struct    
{ char nom[30];   
   char prenom[30];   
   int age;   
} Utilisateur;   
Utilisateur carnet[10];

Dal
0