Mon programme de liste chaînée s'arrête
Fermé
slim
-
Modifié le 16 mai 2022 à 12:21
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 16 mai 2022 à 16:33
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 16 mai 2022 à 16:33
A voir également:
- Mon programme de liste chaînée s'arrête
- Liste déroulante excel - Guide
- Liste déroulante en cascade - Guide
- Programme demarrage windows 10 - Guide
- Liste de diffusion whatsapp - Guide
1 réponse
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 094
Modifié le 16 mai 2022 à 12:51
Modifié le 16 mai 2022 à 12:51
Salut slim,
Tu n'avais pas posté ton code avec les balises de code du forum. A l'avenir fait le pour éviter du travail à la modération, qui a gentiment corrigé ton post.
Pour tes question :
Si tu veux répéter l'affichage du menu et la demande de saisie d'un chiffre tant que 0 n'est pas tapé, il faut que tu mettes ta boucle actuelle (l'appel à ta fonction
En ce qui concerne ton autre question : "lorsque j'execute et j'entre l'un des choix le programme ne me donne pas la resultat direct", elle est incompréhensible pour moi. Sois précis, dis exactement ce que tu fais, le comportement exact de ton programme et ce qu'il devrait faire à la place selon toi.
Sinon, ton programme comporte de nombreux bogues à en juger par les avertissements qui s'affichent en compilant avec les avertissements (et qui peuvent gérer des crashs ou des comportement inattendus) :
Ce n'est pas parce que ton programme n'a pas d'erreurs de syntaxe bloquant la génération d'un exécutable que tu dois ignorer les avertissements qui attirent ton attention sur des problèmes ou des choses que tu as écrites et qui n'ont pas de sens et qui dans 90% des cas sont des bogues.
Commence par le 1er avertissement, comprends le, corrige ton code, et recompile avec les avertissements. Attaque toi ensuite au suivant (toujours le 1er de la liste), corrige le, recompile, etc. Jusqu'à ce que ton code compile proprement.
Là le premier est :
Comprends-tu pourquoi il t'est signalé ?
A l'avenir, rappelle toi que tu ne dois pas attendre d'avoir écrit plus de 200 lignes de code pour d'occuper des avertissements. Compile toujours avec les avertissements et travaille en cycles courts :
ou mieux, écrit un test automatisé avant même d'avoir implémenté le comportement, et lance tous tes tests automatisés systématiquement sur ton code, à chaque modification subséquente, pour vérifier l'absence de régression sur ton code.
Dal
Tu n'avais pas posté ton code avec les balises de code du forum. A l'avenir fait le pour éviter du travail à la modération, qui a gentiment corrigé ton post.
Pour tes question :
Si tu veux répéter l'affichage du menu et la demande de saisie d'un chiffre tant que 0 n'est pas tapé, il faut que tu mettes ta boucle actuelle (l'appel à ta fonction
choix()et le code qui traite le choix) dans une autre qui boucle tant que cette condition n'est pas avérée.
En ce qui concerne ton autre question : "lorsque j'execute et j'entre l'un des choix le programme ne me donne pas la resultat direct", elle est incompréhensible pour moi. Sois précis, dis exactement ce que tu fais, le comportement exact de ton programme et ce qu'il devrait faire à la place selon toi.
Sinon, ton programme comporte de nombreux bogues à en juger par les avertissements qui s'affichent en compilant avec les avertissements (et qui peuvent gérer des crashs ou des comportement inattendus) :
$ gcc -Wall -Wextra 37595064.c
37595064.c: In function ‘saisirPatient’:
37595064.c:39:25: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘int’ [-Wformat=]
printf("rdv=");scanf("%d",p->rdv);
~^ ~~~~~~
37595064.c: In function ‘ajouterPatient’:
37595064.c:50:6: warning: assignment to ‘liste’ {aka ‘struct cell *’} from incompatible pointer type ‘patient *’ {aka ‘struct <anonymous> *’} [-Wincompatible-pointer-types]
nouv=(patient *)malloc(sizeof(patient));
^
37595064.c:47:41: warning: unused parameter ‘p’ [-Wunused-parameter]
liste ajouterPatient(liste tete,patient p)
~~~~~~~~^
37595064.c: In function ‘sauvegarderPatient’:
37595064.c:137:17: warning: passing argument 1 of ‘fopen’ makes pointer from integer without a cast [-Wint-conversion]
FILE* f=fopen((*chemin),"a");
~^~~~~~~~
In file included from 37595064.c:1:
/usr/include/stdio.h:246:14: note: expected ‘const char * restrict’ but argument is of type ‘char’
extern FILE *fopen (const char *__restrict __filename,
^~~~~
37595064.c: In function ‘recupererListePatient’:
37595064.c:155:17: warning: passing argument 1 of ‘fopen’ makes pointer from integer without a cast [-Wint-conversion]
FILE* f=fopen((*chemin),"r");
~^~~~~~~~
In file included from 37595064.c:1:
/usr/include/stdio.h:246:14: note: expected ‘const char * restrict’ but argument is of type ‘char’
extern FILE *fopen (const char *__restrict __filename,
^~~~~
37595064.c:159:20: warning: format ‘%d’ expects argument of type ‘int *’, but argument 5 has type ‘int’ [-Wformat=]
fscanf(f,"%s %s %d",p.nom,p.prenom,p.rdv);
~^ ~~~~~
37595064.c: In function ‘main’:
37595064.c:211:13: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[20]’ [-Wformat=]
scanf("%s",&fich);
~^ ~~~~~
37595064.c:212:29: warning: passing argument 2 of ‘sauvegarderPatient’ from incompatible pointer type [-Wincompatible-pointer-types]
sauvegarderPatient(tete,&fich);
^~~~~
37595064.c:135:42: note: expected ‘char *’ but argument is of type ‘char (*)[20]’
void sauvegarderPatient(liste tete,char *chemin)
~~~~~~^~~~~~
37595064.c:217:13: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[20]’ [-Wformat=]
scanf("%s",&fich);
~^ ~~~~~
37595064.c:218:37: warning: passing argument 2 of ‘recupererListePatient’ from incompatible pointer type [-Wincompatible-pointer-types]
tete=recupererListePatient(tete,&fich);
^~~~~
37595064.c:153:46: note: expected ‘char *’ but argument is of type ‘char (*)[20]’
liste recupererListePatient(liste tete,char *chemin)
~~~~~~^~~~~~
37595064.c: In function ‘supprimerPatient’:
37595064.c:114:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
37595064.c: In function ‘main’:
37595064.c:170:13: warning: ‘tete’ is used uninitialized in this function [-Wuninitialized]
liste tete,tete1=tete;
^~~~~
Ce n'est pas parce que ton programme n'a pas d'erreurs de syntaxe bloquant la génération d'un exécutable que tu dois ignorer les avertissements qui attirent ton attention sur des problèmes ou des choses que tu as écrites et qui n'ont pas de sens et qui dans 90% des cas sont des bogues.
Commence par le 1er avertissement, comprends le, corrige ton code, et recompile avec les avertissements. Attaque toi ensuite au suivant (toujours le 1er de la liste), corrige le, recompile, etc. Jusqu'à ce que ton code compile proprement.
Là le premier est :
37595064.c: In function ‘saisirPatient’:
37595064.c:39:25: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘int’ [-Wformat=]
printf("rdv=");scanf("%d",p->rdv);
~^ ~~~~~~
Comprends-tu pourquoi il t'est signalé ?
A l'avenir, rappelle toi que tu ne dois pas attendre d'avoir écrit plus de 200 lignes de code pour d'occuper des avertissements. Compile toujours avec les avertissements et travaille en cycles courts :
- dès que tu as écrit quelques lignes, compile et vérifie l'absence d'erreurs et d'avertissements
- dès que tu as écrit quelques lignes dont tu peux tester le comportement, exécute ton programme et vérifie ce comportement
ou mieux, écrit un test automatisé avant même d'avoir implémenté le comportement, et lance tous tes tests automatisés systématiquement sur ton code, à chaque modification subséquente, pour vérifier l'absence de régression sur ton code.
Dal
16 mai 2022 à 16:33
par exemple, déplace ta ligne 173 à l'intérieur de la boucle / , en ligne 176 et retire tous les autres appels que tu fais à cette fonction.
Après chaque appel à , vide le buffer de stdin pour le purger du retour à la ligne et de ce qui a pu être tapé et qui n'a pas été consommé par . La façon standard de le faire en C est comme ceci :
Tu peux mettre ceci dans une fonction, tel quel, et appeler ta fonction ou comme tu veux.
Si ton programme s'arrête, c'est qu'il plante, et s'il plante, c'est, notamment en raison des nombreux problèmes signalés par les Warnings émis par le compilateur qui te signalent tes erreurs.
Si tu ne comprends pas ces messages d'avertissement, après avoir vu ton cours, manuel ou documentation, pose la question ici :-)