A voir également:
- Utilisation des structures
- Notice d'utilisation - Guide
- Utilisation chromecast - Guide
- Votre compte a été désactivé pour violation de nos conditions d’utilisation - Guide
- Droit utilisation musique 30 secondes ✓ - Forum Réseaux sociaux
- La ressource demandée est en cours d'utilisation ✓ - Forum Logiciels
2 réponses
yg_be
Messages postés
23405
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
20 décembre 2024
Ambassadeur
1 557
16 janv. 2017 à 21:11
16 janv. 2017 à 21:11
cela donne un message d'erreur, ou bien cela ne fait pas ce que tu attends?
merci de nous donner des informations.
merci de nous donner des informations.
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
16 janv. 2017 à 22:29
16 janv. 2017 à 22:29
yg_be a raison, quand tu fais
Si tu déclarais
Cela dit, ta question est "j'aimerai savoir pourquoi ce code ne marche pas.", la raison est simple : ton code ne compile pas car il comporte des erreurs de syntaxe qui te sont signalées par le compilateur, lequel balance aussi pas mal d'avertissements, que tu devrais corriger aussi.
Comme ce code est indenté de façon particulièrement illisible, ce n'est pas facile de s'y retrouver.
Alors, le voilà correctement indenté.
là, on y voit plus clair, et on peut aussi mieux localiser les erreurs et avertissements renvoyés par le compilateur :
Le compilateur répond à ta question, c'est pas beau çà ?
Corrige ces erreurs et les causes des avertissements un par un, en commençant par le premier. Après en avoir corrigé un, recompile, et corrige le prochain message d'erreur, etc. Jusqu'à ce que tu aies 0 erreurs et 0 warnings.
Ensuite, tu auras des peut-être des non signalées par le compilateur, mais déjà, dans un premier temps, corrige cela.
Autres observations :
- tu n'as pas besoin de passer un pointeur sur int pour n, passe juste un int, cela te facilitera la vie
- dans ta fonction, quand tu as un pointeur sur une struct, tu accède ses membres avec la notation ->, comme cela :
- gets est fortement déconseillé, utilise fgets
Dal
tous_les_auteurs *auteurs;, tu déclares juste un pointeur sur la struct, et tu n'alloues pas la mémoire nécessaire.
Si tu déclarais
tous_les_auteurs auteurs;cela serait déjà mieux, et en plus la ligne
saisie_auteur(&auteurs,&n);deviendrait cohérente avec le prototype de saisie_auteur, qui en premier argument attend un pointeur sur tous_les_auteurs, et non pas un pointeur sur un pointeur sur tous_les_auteurs.
Cela dit, ta question est "j'aimerai savoir pourquoi ce code ne marche pas.", la raison est simple : ton code ne compile pas car il comporte des erreurs de syntaxe qui te sont signalées par le compilateur, lequel balance aussi pas mal d'avertissements, que tu devrais corriger aussi.
Comme ce code est indenté de façon particulièrement illisible, ce n'est pas facile de s'y retrouver.
Alors, le voilà correctement indenté.
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { int id_aut; char nom_aut[30]; char adr_aut[30]; } auteur; typedef struct { auteur tab[30]; } tous_les_auteurs; void saisie_auteur(tous_les_auteurs *auteurs,int *n) { int i,j; for(i=0;i<*n;i++) { do { printf("donner le nom de l'auteur \n"); gets((*auteurs).tab[i].nom_aut ); } while (strlen((*auteurs).tab[i].nom)<=0); printf("donner l'identifiant de l'auteur \n"); scanf("%d",&(*auteurs).tab[i].id_aut ); if (i>0) { j=i; do { if((*auteurs).tab[j].id_aut==(*aut).tab[j- 1].id_aut) { printf("donner un autre identifiant car celui-ci existe déjà \n"); scanf("%d",&(*auteurs).tab[i].id_aut ); } j--; } while (j!=0); } do { printf("donner l'addresse de l'auteur \n"); gets((*auteurs).tab[i].adr_aut ); } while (strlen((*auteurs).tab[i].adr)<=0); } } int main() { int *n; tous_les_auteurs *auteurs; printf("donner le nombre d'auteur"); scanf("%d",n); saisie_auteur(&auteurs,&n); return 0; }
là, on y voit plus clair, et on peut aussi mieux localiser les erreurs et avertissements renvoyés par le compilateur :
$ gcc -Wall hermaine.c
hermaine.c: In function ‘saisie_auteur’:
hermaine.c:20:4: warning: ‘gets’ is deprecated (declared at /usr/include/stdio.h:638) [-Wdeprecated-declarations]
gets((*auteurs).tab[i].nom_aut );
^
hermaine.c:21:36: error: ‘auteur’ has no member named ‘nom’
} while (strlen((*auteurs).tab[i].nom)<=0);
^
hermaine.c:27:36: error: ‘aut’ undeclared (first use in this function)
if((*auteurs).tab[j].id_aut==(*aut).tab[j- 1].id_aut) {
^
hermaine.c:27:36: note: each undeclared identifier is reported only once for each function it appears in
hermaine.c:36:4: warning: ‘gets’ is deprecated (declared at /usr/include/stdio.h:638) [-Wdeprecated-declarations]
gets((*auteurs).tab[i].adr_aut );
^
hermaine.c:37:36: error: ‘auteur’ has no member named ‘adr’
} while (strlen((*auteurs).tab[i].adr)<=0);
^
hermaine.c: In function ‘main’:
hermaine.c:48:16: warning: passing argument 1 of ‘saisie_auteur’ from incompatible pointer type
saisie_auteur(&auteurs,&n);
^
hermaine.c:15:6: note: expected ‘struct tous_les_auteurs *’ but argument is of type ‘struct tous_les_auteurs **’
void saisie_auteur(tous_les_auteurs *auteurs,int *n) {
^
hermaine.c:48:25: warning: passing argument 2 of ‘saisie_auteur’ from incompatible pointer type
saisie_auteur(&auteurs,&n);
^
hermaine.c:15:6: note: expected ‘int *’ but argument is of type ‘int **’
void saisie_auteur(tous_les_auteurs *auteurs,int *n) {
^
Le compilateur répond à ta question, c'est pas beau çà ?
Corrige ces erreurs et les causes des avertissements un par un, en commençant par le premier. Après en avoir corrigé un, recompile, et corrige le prochain message d'erreur, etc. Jusqu'à ce que tu aies 0 erreurs et 0 warnings.
Ensuite, tu auras des peut-être des non signalées par le compilateur, mais déjà, dans un premier temps, corrige cela.
Autres observations :
- tu n'as pas besoin de passer un pointeur sur int pour n, passe juste un int, cela te facilitera la vie
- dans ta fonction, quand tu as un pointeur sur une struct, tu accède ses membres avec la notation ->, comme cela :
auteurs->auteur[0].id_aut = 123c'est plus habituel que de déréférencer le pointeur comme tu le fais
- gets est fortement déconseillé, utilise fgets
Dal
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
Modifié par [Dal] le 17/01/2017 à 09:24
Modifié par [Dal] le 17/01/2017 à 09:24
il faut lire
auteurs->tab[0].id_aut = 123, car ton tableau contenu dans ta première struct s'appelle "tab"
16 janv. 2017 à 21:23
si tu ne l'as pas encore fait, commence par un exercice plus simple, sans la structure.
20 janv. 2017 à 12:26
merci
je vais l'esseyer