Prog C , ou est l'erreur
Résolu/Fermé
A voir également:
- Prog C , ou est l'erreur
- Erreur 0x80070643 - Accueil - Windows
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- Erreur 1001 outlook - Accueil - Bureautique
- Instagram une erreur s'est produite - Forum Instagram
- J'aime par erreur facebook notification - Forum Facebook
7 réponses
aramir
Messages postés
959
Date d'inscription
mardi 26 février 2008
Statut
Membre
Dernière intervention
26 décembre 2016
222
26 janv. 2010 à 23:36
26 janv. 2010 à 23:36
Je te répond rapidement avant d'aller me coucher:
d'après GCC: struct pers n'a pas de menbre nommé prec ou suiv.
erreur l.18 102 103 142 162 193 195 197
d'après GCC: struct pers n'a pas de menbre nommé prec ou suiv.
erreur l.18 102 103 142 162 193 195 197
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
662
26 janv. 2010 à 23:57
26 janv. 2010 à 23:57
Bonjour,
C'est une bonne idée d'éviter d'avoir plusieurs fois les mêmes lignes de code écrites comme ici :
puisque les scanf sont exécutés dans les deux cas, pourquoi ne pas écrire simplement :
?
Ce genre de choses éclaircit le code, donc améliore sa lisibilité (pour trouver un bug ou simplement relire son programme après quelques semaines) et aussi évite des bugs (on modifie une partie, mais on oublie de modifier l'autre qui fait exactement la même chose)
C'est une bonne idée d'éviter d'avoir plusieurs fois les mêmes lignes de code écrites comme ici :
if (tete==NULL) { printf("entrez le numero de la cn \n"); _flushall(); scanf("%s",&e->nc); printf ("entrez le nom\n"); _flushall(); scanf ("%s",&e->nom); printf ("prenom?\n"); _flushall(); scanf ("%s",&e->prenom); printf ("entrez l'adresse\n"); _flushall(); scanf ("%s",&e->adresse); printf ("entrez la date de naissance\n"); _flushall(); scanf ("%d",&e->date); printf ("entrez le lieu de naissance\n"); _flushall(); scanf ("%s",&e->lieu); printf ("entrez la nationalité\n"); _flushall(); scanf ("%s",&e->nation); printf ("entrez la date de délivrance\n"); _flushall(); scanf ("%s",&e->dv); } else { printf("liste pas vide , entrez un nouveu element \n" ); printf("entrez le numero de la cn \n"); _flushall(); scanf("%s",&e->nc); printf ("entrez le nom\n"); _flushall(); scanf ("%s",&e->nom); printf ("prenom?\n"); _flushall(); scanf ("%s",&e->prenom); printf ("entrez l'adresse\n"); _flushall(); scanf ("%s",&e->adresse); printf ("entrez la date de naissance\n"); _flushall(); scanf ("%d",&e->date); printf ("entrez le lieu de naissance\n"); _flushall(); scanf ("%s",&e->lieu); printf ("entrez la nationalité\n"); _flushall(); scanf ("%s",&e->nation); printf ("entrez la date de délivrance\n"); _flushall(); scanf ("%s",&e->dv); }
puisque les scanf sont exécutés dans les deux cas, pourquoi ne pas écrire simplement :
if (tete!=NULL) { printf("liste pas vide , entrez un nouveu element \n" ); } printf("entrez le numero de la cn \n"); _flushall(); scanf("%s",&e->nc); printf ("entrez le nom\n"); _flushall(); scanf ("%s",&e->nom); printf ("prenom?\n"); _flushall(); scanf ("%s",&e->prenom); printf ("entrez l'adresse\n"); _flushall(); scanf ("%s",&e->adresse); printf ("entrez la date de naissance\n"); _flushall(); scanf ("%d",&e->date); printf ("entrez le lieu de naissance\n"); _flushall(); scanf ("%s",&e->lieu); printf ("entrez la nationalité\n"); _flushall(); scanf ("%s",&e->nation); printf ("entrez la date de délivrance\n"); _flushall(); scanf ("%s",&e->dv);
?
Ce genre de choses éclaircit le code, donc améliore sa lisibilité (pour trouver un bug ou simplement relire son programme après quelques semaines) et aussi évite des bugs (on modifie une partie, mais on oublie de modifier l'autre qui fait exactement la même chose)
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
662
27 janv. 2010 à 00:00
27 janv. 2010 à 00:00
PS: lorsque tu envoies un gros code comme le tien sur ce forum, utilise les balises < code > (bouton à coté de gras italique souligné), ainsi les espaces d'indentation seront conservés
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
662
27 janv. 2010 à 00:02
27 janv. 2010 à 00:02
Et PS encore :
D'ailleurs je n'ai pas regardé bien plus loin, mais il y a un risque d'erreur ici, puisque apparemment même si tête est vide tu demandes des données...
D'ailleurs je n'ai pas regardé bien plus loin, mais il y a un risque d'erreur ici, puisque apparemment même si tête est vide tu demandes des données...
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
27 janv. 2010 à 00:07
27 janv. 2010 à 00:07
Hello,
J'ai pas tout regardé, mais :
tu écris : scanf("%s",&e->nc); alors que e->nc est de type char.
Il faut donc utiliser %c.
Il ne faut pas mettre non plus d'esperluette (&) devant les chaînes de caractères pour afficher son adresse.
scanf ("%s",&e->nom);
Il faut mettre : e->nom tout simplement.
De plus attention avec ton utilisation des scanf. Tu ne fais aucun contrôle sur la taille. C'est pourquoi il vaut mieux utiliser fgets avec les contrôles qui vont bien. Tu peux même faire une fonction pour rendre encore le tout plus propre.
Le prototype de main() sans argument est : int main(void). Il ne faut pas non plus oublier de renvoyer 0 ou EXIT_SUCCESS enfin de programme pour signaler que tout va bien.
Corrige tout ces points et n'hésite pas à reposter la nouvelle version s'il y a toujours des erreurs en les décrivant.
Cdlt,
J'ai pas tout regardé, mais :
tu écris : scanf("%s",&e->nc); alors que e->nc est de type char.
Il faut donc utiliser %c.
Il ne faut pas mettre non plus d'esperluette (&) devant les chaînes de caractères pour afficher son adresse.
scanf ("%s",&e->nom);
Il faut mettre : e->nom tout simplement.
De plus attention avec ton utilisation des scanf. Tu ne fais aucun contrôle sur la taille. C'est pourquoi il vaut mieux utiliser fgets avec les contrôles qui vont bien. Tu peux même faire une fonction pour rendre encore le tout plus propre.
Le prototype de main() sans argument est : int main(void). Il ne faut pas non plus oublier de renvoyer 0 ou EXIT_SUCCESS enfin de programme pour signaler que tout va bien.
Corrige tout ces points et n'hésite pas à reposter la nouvelle version s'il y a toujours des erreurs en les décrivant.
Cdlt,
voici mon nouveau code , dont j'ai pas fait de grand changement a part le ' & ' d'adressage que j'ai enlevé des chaines de caracteres , et le int main(void)
, et mettre EXIT SUCCESS a la fin
j'ai oublié de preciser que je travaille avec Code:Blocks ,
si quelqun pourrait l'essayer sur C et voir comment se comporte le programme
voici ce que me retourne le programme Process terminated with status -1073741819
Merci beacoup pour votre aide
, et mettre EXIT SUCCESS a la fin
j'ai oublié de preciser que je travaille avec Code:Blocks ,
si quelqun pourrait l'essayer sur C et voir comment se comporte le programme
voici ce que me retourne le programme Process terminated with status -1073741819
Merci beacoup pour votre aide
#include<stdio.h> #include<stdlib.h> char num; typedef struct pers { char nc ; char nom [10]; char prenom [10]; char adresse [20]; char date ; char lieu[20]; char nation[20]; char dv ; pers*suiv; pers*prec; }pers; struct pers *tete,*e; void creation (void) { char rep='o'; while (rep=='o') { e=(pers*)malloc(sizeof(pers)); if (tete==NULL) { printf("entrez le numero de la cn \n"); _flushall(); scanf("%c",&e->nc); printf ("entrez le nom\n"); _flushall(); scanf ("%s",e->nom); printf ("prenom?\n"); _flushall(); scanf ("%s",e->prenom); printf ("entrez l'adresse\n"); _flushall(); scanf ("%s",e->adresse); printf ("entrez la date de naissance\n"); _flushall(); scanf ("%s",&e->date); printf ("entrez le lieu de naissance\n"); _flushall(); scanf ("%s",e->lieu); printf ("entrez la nationalité\n"); _flushall(); scanf ("%s",e->nation); printf ("entrez la date de délivrance\n"); _flushall(); scanf ("%c",&e->dv); } else { printf("liste pas vide , entrez un nouveu element \n" ); printf("entrez le numero de la cn \n"); _flushall(); scanf("%s",&e->nc); printf ("entrez le nom\n"); _flushall(); scanf ("%s",e->nom); printf ("prenom?\n"); _flushall(); scanf ("%s",e->prenom); printf ("entrez l'adresse\n"); _flushall(); scanf ("%s",e->adresse); printf ("entrez la date de naissance\n"); _flushall(); scanf ("%d",&e->date); printf ("entrez le lieu de naissance\n"); _flushall(); scanf ("%s",e->lieu); printf ("entrez la nationalité\n"); _flushall(); scanf ("%s",e->nation); printf ("entrez la date de délivrance\n"); _flushall(); scanf ("%s",&e->dv); } tete=e; e->suiv=NULL; e->prec=NULL; printf ("avez vous une autre personne a entrez? o / n "); _flushall(); scanf ("%s",&rep); _flushall(); } } void consultation (void) { printf("la liste des citoyens \n "); e=tete; if (e==NULL) { printf(" la liste est vide \n"); } else { while ( e!=NULL ) { puts(""); puts("========================================"); printf("%d",e->nc); printf("%s",e->nom); printf("%s",e->prenom); printf("%s",e->adresse); printf("%s",e->lieu); printf("%s",e->date); printf("%s",e->nation); printf("%s",e->dv); puts("========================================"); puts(""); e=e->suiv; } } } int main (void) { tete = NULL ; char ans='o'; int choice ; while (ans == 'o' ) { puts (" Bonjour \a "); puts (" 1 - enregistrez un citoyens "); puts (" 2 - Chercher un citoyen "); puts (" 3 - Suprimer un citoyen "); puts (" 4 - Consultaion ") ; puts (" 5 - Nombre total des citoyen "); puts (" 6 - Quiter ! "); printf("choisissez une opération :\n"); scanf("%d",&choice); if (choice == 1) { creation(); } if (choice == 4) { consultation(); } if (choice == 6) { puts(" au revoir "); } _flushall(); printf("avez vous une autre opération a faire ? o / n " ); _flushall(); scanf("%c",& ans ); } EXIT_SUCCESS; }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
662
27 janv. 2010 à 01:35
27 janv. 2010 à 01:35
tu as toujours ton bout de code en double dont je t'ai parlé avant
de plus je vois que ton indentation n'est pas bonne.
Ce n'est pas seulement pour faire joli, c'est primordial si tu veux pouvoir lire toi même, comprendre et faire lire et faire comprendre rapidement ton code.
La règle (simple) : après chaque accolade ouvrante tu indentes. A chaque accolade fermante tu enlève l'indentation.
de plus je vois que ton indentation n'est pas bonne.
Ce n'est pas seulement pour faire joli, c'est primordial si tu veux pouvoir lire toi même, comprendre et faire lire et faire comprendre rapidement ton code.
La règle (simple) : après chaque accolade ouvrante tu indentes. A chaque accolade fermante tu enlève l'indentation.
if (...) { code; code; while(...) { code; code; } code; }
je crois que le double code ne nui pas a la totalité du programme donc j'ai laissé
et pour l'indentation je vois pas ou est le probleme ? puisque le pgm s'execute sans probleme ( sinon c'est ou exactement l'erreur d'indentation ? :s )
je trouve toujours pas mon probleme , quand le pgm sort d'un seul coup sa veut dire quoi , et a tu vu le Process terminated with status -1073741819
sa veut dire quoi sa aussi ?
et pour l'indentation je vois pas ou est le probleme ? puisque le pgm s'execute sans probleme ( sinon c'est ou exactement l'erreur d'indentation ? :s )
je trouve toujours pas mon probleme , quand le pgm sort d'un seul coup sa veut dire quoi , et a tu vu le Process terminated with status -1073741819
sa veut dire quoi sa aussi ?
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
662
27 janv. 2010 à 01:37
27 janv. 2010 à 01:37
d'autre part :
ici c'est comme si tu écrivais :
c'est à dire c'est comme
(instruction vide qui ne fait rien)
je pense que tu voulais dire
(main est in fonction et doit retourner qqchose)
c'est peut-être la cause de ta valeur de sortie bizarre.
EXIT_SUCCESS;
ici c'est comme si tu écrivais :
0;
c'est à dire c'est comme
;
(instruction vide qui ne fait rien)
je pense que tu voulais dire
return EXIT_SUCCESS;
(main est in fonction et doit retourner qqchose)
c'est peut-être la cause de ta valeur de sortie bizarre.
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
662
>
Soufedj
27 janv. 2010 à 02:31
27 janv. 2010 à 02:31
non, je n'ai pas de compilateur sous la main aujourd'hui .
ceci dit :
char date ;
ceci me parait suspect, puisque après tu fais scanf(...%s..., e->date)
ceci dit :
char date ;
ceci me parait suspect, puisque après tu fais scanf(...%s..., e->date)
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
662
>
Soufedj
27 janv. 2010 à 02:37
27 janv. 2010 à 02:37
d'autre part, tu me dis "ce n'est pas ça"... oui mais non.
Une mauvaise écriture (répétition des memes lignes de code inutile, mauvaise indentation), ça laisse la porte ouverte à d'autres bugs qui peuvent se rajouter, et ça empêche de voir ceux existants. ça doit être une priorité.
Donc ça ne mange pas de pain de le faire, et de reposter ensuite ton code, qui gagnera en lisibilité (et qui donnera peut-être envie à plus de personnes de te donner un coup de main ;) )
Une mauvaise écriture (répétition des memes lignes de code inutile, mauvaise indentation), ça laisse la porte ouverte à d'autres bugs qui peuvent se rajouter, et ça empêche de voir ceux existants. ça doit être une priorité.
Donc ça ne mange pas de pain de le faire, et de reposter ensuite ton code, qui gagnera en lisibilité (et qui donnera peut-être envie à plus de personnes de te donner un coup de main ;) )
Soufedj
>
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
27 janv. 2010 à 02:40
27 janv. 2010 à 02:40
o fait ,
j'ai normalement trouvé le problème pourquoi sa passait pas ,
c'est parce que j'avais mis rep comme char , et quand j'entrais si je voulais continuer ou arrêter dans création j'ai mis rep comme "%s" alors il fallait mettre " %c "
alalallalalalal , c'était vraiment pas grand chose mais qui fait beaucoup de dégâts
je vais voir si le tout marche ou pas !
j'ai normalement trouvé le problème pourquoi sa passait pas ,
c'est parce que j'avais mis rep comme char , et quand j'entrais si je voulais continuer ou arrêter dans création j'ai mis rep comme "%s" alors il fallait mettre " %c "
alalallalalalal , c'était vraiment pas grand chose mais qui fait beaucoup de dégâts
je vais voir si le tout marche ou pas !
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
662
>
Soufedj
27 janv. 2010 à 02:43
27 janv. 2010 à 02:43
ahhh oui ça doit certainement être ça.
Vérifie aussi avec la variable date...
et évite d'avoir des copié collé de bout de code !!!!
sinon tu risques d'avoir l'erreur à double aussi... deux fois plus de travaille pour corriger (si tu y penses!)
Vérifie aussi avec la variable date...
et évite d'avoir des copié collé de bout de code !!!!
sinon tu risques d'avoir l'erreur à double aussi... deux fois plus de travaille pour corriger (si tu y penses!)
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
662
27 janv. 2010 à 02:56
27 janv. 2010 à 02:56
et pour l'indentation je vois pas ou est le probleme ? puisque le pgm s'execute sans probleme ( sinon c'est ou exactement l'erreur d'indentation ? :s )
ici par exemple :
ça devrait plutot être quelquechose comme :
(j'ai juste fait copié collé avec les erreurs... bref c'est juste pour voir les indentations)
ici par exemple :
while (rep=='o') { e=(pers*)malloc(sizeof(pers)); if (tete==NULL) { printf("entrez le numero de la cn \n"); _flushall(); scanf("%c",&e->nc); ... } else { printf("liste pas vide , entrez un nouveu element \n" ); printf("entrez le numero de la cn \n"); _flushall(); scanf("%s",&e->nc); ..... } tete=e; e->suiv=NULL; e->prec=NULL; printf ("avez vous une autre personne a entrez? o / n "); _flushall(); scanf ("%s",&rep); _flushall(); } }
ça devrait plutot être quelquechose comme :
type fonction(...) { while (rep=='o') { e=(pers*)malloc(sizeof(pers)); if (tete==NULL) { printf("entrez le numero de la cn \n"); _flushall(); scanf("%c",&e->nc); ... } else { printf("liste pas vide , entrez un nouveu element \n" ); printf("entrez le numero de la cn \n"); _flushall(); scanf("%s",&e->nc); ..... } tete=e; e->suiv=NULL; e->prec=NULL; printf ("avez vous une autre personne a entrez? o / n "); _flushall(); scanf ("%s",&rep); _flushall(); } }
(j'ai juste fait copié collé avec les erreurs... bref c'est juste pour voir les indentations)
26 janv. 2010 à 23:57