Utilisation des structures

Fermé
hermaine - Modifié par KX le 16/01/2017 à 21:10
 hermaine - 20 janv. 2017 à 12:26
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

yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
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.
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
16 janv. 2017 à 21:23
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.
0
hermaine > yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024
20 janv. 2017 à 12:26
ok
merci
je vais l'esseyer
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
16 janv. 2017 à 22:29
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
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
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"
0