Utilisation des structures [Fermé]

Signaler
-
 hermaine -
Bonsoir,
j'aimerai savoir pourquoi ce code ne marche pas.
merci d'avance.


#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;
}

2 réponses

Messages postés
15205
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 avril 2021
832
cela donne un message d'erreur, ou bien cela ne fait pas ce que tu attends?
merci de nous donner des informations.
Messages postés
15205
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 avril 2021
832
Je me demande tout-de-même si tu ne devrais pas déclarer une structure de type tous_les_auteurs. il me semble que ton pointeur auteur n'est jamais initialisé.
si tu ne l'as pas encore fait, commence par un exercice plus simple, sans la structure.
>
Messages postés
15205
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 avril 2021

ok
merci
je vais l'esseyer
Messages postés
5491
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
2 avril 2021
932
yg_be a raison, quand tu fais
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 = 123
c'est plus habituel que de déréférencer le pointeur comme tu le fais
- gets est fortement déconseillé, utilise fgets


Dal
Messages postés
5491
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
2 avril 2021
932
il faut lire
auteurs->tab[0].id_aut = 123
, car ton tableau contenu dans ta première struct s'appelle "tab"