Neo_13 Posted May 21, 2004 Share Posted May 21, 2004 Salut... En ce week end de pont, je me suis dit que j'allais prendre de l'avance sur mes TP de C... Vu que je ne suis pas chez moi, je suis obligé de travailler sous knoppix, avec un clé usb en /mnt/cle pour sauvegarder... le problème du jour est le suivant... Je vais essayer d'être clair sans lister des pages de code... dans mon main, j'ai : int choix; ... while(choix!=-1); choix=menu(); switch(choix) { case 1: ... case 11: ... } et dans la fonction menu : int menu() { int test ... scanf("%d",&test); return test; } A la première éxecution de la boucle, aucun problème, je prend l'un des choix, j'accompli l'instruction, le programme tourne et retour au menu... mais là, au lieu d'attendre mon choix, il mets choix invalide et pars en boucle infinie de choix invalide et de menu donc pti printf pour voir, et test dès la 2e fois vaut -xxxxxxxx bref l'adresse de test au lieu de la valeur que j'aurais saisi s'il m'avait laissé le choix... Et je comprend pas pourquoi!!!!!!! Est-ce le GCC de Knoppix 3.4 qui est buggé au taquet ? Devrais booter knoppix avec le kernel 2.4.26 au lieu de 2.6.6 ce qui m'éviterais qu'il fasse nimp?????? Question subsidiaire : c'est normal que dans mon stdio.h j'ai pas fflushall ? Link to comment Share on other sites More sharing options...
Sentinel Posted May 21, 2004 Share Posted May 21, 2004 Ca sent le break; oublié dans chacun des case du switch... non ? Link to comment Share on other sites More sharing options...
Angel Eyes Posted May 21, 2004 Share Posted May 21, 2004 fais un fflush(stdin) avant le scanf ... Link to comment Share on other sites More sharing options...
Neo_13 Posted May 21, 2004 Author Share Posted May 21, 2004 les deux sont fait... sinon, je mets ici le code, il est pas bien compliqué, mais ya quand 300lignes (pour faire un système de menu, ça prend vite beaucoup de lignes) Parce que le pire, c'est que c'est la partie la plus facile, cette connerie de menu... les fonctions sont codées dans d'autres fichiers... et fonctionnent, toutes Sauter le code /*********************************/ /* xxxxxxxxxxxxx & xxxxxxxxxxxxx */ /* 1A MCF */ /*********************************/ /* Fichier principal */ /* Menu de sélection */ /*********************************/ #include <stdlib.h> #include <stdio.h> #include "polynome.h" /** * affiche_p_polynome * Affiche les polynomes p1 et p2 s'ils existent dans le menu général * * @param polynome p1 * @param polynome p2 * @return void */ void affiche_p_menu(polynome p1, polynome p2,polynome p) { if(p1!=NULL) { puts("Actuellement, p1 vaut :"); afficher_polynome(p1); } if(p2!=NULL) { puts("Actuellement, p2 vaut :"); afficher_polynome(p2); } if(p!=NULL) { puts("Actuellement, p vaut :"); afficher_polynome(p); } puts(" "); } /** * menu * Crée le menu et permet de saisir le choix de l'utilisateur * * @param void * @return int choix le choix de l'utilisateur */ int menu() { int test; fflush(stdin); puts("\t 1 - Saisir p1"); puts("\t 2 - Saisir p2"); puts("\t 3 - Echanger p1 et p2"); puts("\t 4 - Additionner p1 et p2 (p1+p2)"); puts("\t 5- Soustraire p2 à p1 (p1-p2)"); puts("\t 6 - Multiplier p1 par p2 (p1*p2)"); puts("\t 7 - Diviser p1 par p2 (p1/p2)"); puts("\t 8 - Evaluer un des polynomes en un point"); puts("\t 9 - Dériver un des polynomes"); puts("\t10 - Calculer la primitive d'un des polynomes"); puts("\t11 - Intégrer un polynome entre deux bornes"); puts("\t 0 - Sortir du programme\n"); printf("Quel est votre choix : "); /* printf("%d",choix);*/ scanf("%d",test); return test; } /** * stockage * Permet d'enregistrer le polynome temp (qui est le résultat d'un calcul) dans * p1, p2 ou p * * @param polynome p1 * @param polynome p2 * @param polynome p * @param polynome temp * @return void */ void stockage(polynome p1, polynome p2, polynome p, polynome temp) { int test1,test2; puts("Voulez-vous stocker ce résultat dans l'un des polynomes ?"); puts("1 - Oui\t2 - Non"); scanf("%d",&test1); if(test1==1) { puts("Si vous le stocker dans p1 ou p2,"); puts("ce résultat peut resservir dans l'un des calculs suivants."); puts("Dans lequel des polynomes voulez-vous stocker le résulat ?"); puts("1 - p1\t2 - p2\t3 - p"); scanf("%d",&test2); } else return; if(test2==1) p1=recopier(temp); if(test2==2) p2=recopier(temp); if(test2==3) p=recopier(temp); if(test2<1 || test2>3) { puts("Mauvais choix"); stockage(p1,p2,p,temp); } } /** * choix * Permet de recopier dans temp soit p1 soit p2 * * @param polynome p1 * @param polynome p2 * @return polynome temp */ polynome choix_p(polynome p1,polynome p2) { int choix; puts("Quel polynome voulez-vous utiliser ?"); puts("1 - p1\t2 - p2"); scanf("%d",&choix); if(choix==1) return p1; if(choix==2) return p2; if(choix!=1 && choix!=2) return choix_p(p1,p2); } main() { int choix; float resultat,x,a,b; polynome p1=NULL; polynome p2=NULL; polynome p=NULL; polynome temp=NULL; puts("Bienvenue dans le programme de calcul sur les polynomes creux !\n"); while(choix!=-1) { affiche_p_menu(p1,p2,p); puts("\t\tMenu principal :\n"); choix=menu(); printf("choix : %d\n\n",choix); switch(choix) { case 1: { puts("Choix 1 : Saisie de p1"); p1=saisir_polynome(); puts("Vous avez saisi :"); afficher_polynome(p1); fflush(stdin); break; } case 2: { puts("Choix 2 : Saisie de p2"); p2=saisir_polynome(); puts("Vous avez saisi :"); afficher_polynome(p2); fflush(stdin); break; } case 3: { puts("Choix 3 : Echanger p1 et p2"); if(p1!=NULL && p2!=NULL) { p=recopier(p1); p1=recopier(p2); p2=recopier(p); } else puts("Il faut avoir saisi p1 ET p2 pour pouvoir les échanger"); break; } case 4: { puts("Choix 4 : Additionner p1 et p2"); temp=somme(p1,p2); puts("Résultat :"); afficher_polynome(temp); stockage(p1,p2,p,temp); break; } case 5: { puts("Choix 5 : Soustraire p2 à p1"); temp=soustraction(p1,p2); puts("Résultat :"); afficher_polynome(temp); stockage(p1,p2,p,temp); break; } case 6: { puts("Choix 6 : Produit de p1 et p2"); temp=multiplication(p1,p2); puts("Résultat :"); afficher_polynome(temp); stockage(p1,p2,p,temp); break; } case 7: { puts("Choix 7 : Division de p1 par p2"); temp=division(p1,p2); puts("Résultat :"); afficher_polynome(temp); stockage(p1,p2,p,temp); break; } case 8: { puts("Choix 8 : Evaluer un polynome en un point"); temp=choix_p(p1,p2); puts("En quel point voulez-vous évaluer le polynome ?"); scanf("%f",&x); resultat=evaluer(x,temp); printf("Résultat : %f",resultat); break; } case 9: { puts("Choix 9 : Dériver d'un polynome"); temp=choix_p(p1,p2); temp=derivation(temp); puts("Résultat :"); afficher_polynome(temp); stockage(p1,p2,p,temp); break; } case 10: { puts("Choix 10 : Primitive d'un polynome"); temp=choix_p(p1,p2); temp=primitive(temp); puts("Résultat :"); afficher_polynome(temp); stockage(p1,p2,p,temp); break; } case 11: { puts("Choix 11 : Intégration d'un polynome entre deux bornes"); temp=choix_p(p1,p2); puts("Saisissez les bornes d'intégration : "); scanf("%f",&a); scanf("%f",&b); resultat=integration(a,b,temp); puts("Résultat :"); afficher_polynome(temp); stockage(p1,p2,p,temp); break; } case 0: { puts("Sortie du programme"); exit(0); break; } default: { puts("Choix incorrect"); } } } } Link to comment Share on other sites More sharing options...
Neo_13 Posted May 21, 2004 Author Share Posted May 21, 2004 Pour la suite Link to comment Share on other sites More sharing options...
Angel Eyes Posted May 21, 2004 Share Posted May 21, 2004 .. while(choix!=-1); choix=menu(); switch(choix) { case 1: ... case 11: ... } Vire moi cette horreur (le ; ) !!!! .. while(choix!=-1) { choix=menu(); switch(choix) { case 1: ... case 11: ... } } Link to comment Share on other sites More sharing options...
Sentinel Posted May 21, 2004 Share Posted May 21, 2004 Ouais enfin bon, je ne crois pas qu'il ait véritablement tapé ce code A mon avis il a juste retapé ça à l'arrache histoire de nous montrer le principe général... Link to comment Share on other sites More sharing options...
NiTrOuS Posted May 21, 2004 Share Posted May 21, 2004 Ca c est le probleme entre do while() et while(); Link to comment Share on other sites More sharing options...
Neo_13 Posted May 21, 2004 Author Share Posted May 21, 2004 J'ai mis le code tel qu'il est, en fin presque... je vais aller le mettre tel qu'il est EDIT : je crois que j'ai enlever les expérimentations que j'ai faites... donc mon code doit s'approcher de ça... Link to comment Share on other sites More sharing options...
Angel Eyes Posted May 21, 2004 Share Posted May 21, 2004 Ca c est le probleme entre do while() et while(); do while (); et while () merci de corriger ... PS : il faut éviter les do ... while (), ça donne au minimum un passage dans la boucle, ce qui n'est pas toujours voulu !!! Link to comment Share on other sites More sharing options...
Angel Eyes Posted May 21, 2004 Share Posted May 21, 2004 1. tu es allergique à printf ??? 2. on prototype les fonctions please, et j'aimerais savoir pourquoi pas mal de programmeurs en C ne le font jamais et mettent systématiquement main() en dernier, c'est loin d'être pratique ... 3. je lance mon serveur linux, je teste et je reviens PS : sans les .h, ça va être hard à tester ... PPS : ligne 74, test n'est pas un pointeur, mets &test à la place Link to comment Share on other sites More sharing options...
Neo_13 Posted May 21, 2004 Author Share Posted May 21, 2004 euh oui... pour le pointeur, c'est parce qu'à force, j'avais fait un test en pointeur, et ça merdait aussi d'où retour en arrière, mais j'ai raté un truc... Stu veux, je t'envoie le .tar, pour voir... Link to comment Share on other sites More sharing options...
Angel Eyes Posted May 21, 2004 Share Posted May 21, 2004 ok, envoie toujours Link to comment Share on other sites More sharing options...
Neo_13 Posted May 21, 2004 Author Share Posted May 21, 2004 il est parti le puts sont plus rapide à l'exec que les printf, d'ou le peu de printf dans mon code... Link to comment Share on other sites More sharing options...
milohoffman Posted May 21, 2004 Share Posted May 21, 2004 et ça sert quoi ce machin ? Link to comment Share on other sites More sharing options...
Neo_13 Posted May 21, 2004 Author Share Posted May 21, 2004 A avoir une bonne note en tp de C Sinon, ca fait un certain nombre de calcul sur des polynomes (sans grand interêt pour un nomre de facteur jusqu'à 10... mais certaines fois on peut manipuler des centaines de facteurs Link to comment Share on other sites More sharing options...
Angel Eyes Posted May 21, 2004 Share Posted May 21, 2004 l'utilisation de scanf dans saisir_monome est trop simpliste et pose des problèmes ... scan=scanf("%dx^%d",&(m->coef),&(m->puiss)); ce truc ne renvoie 0 que si tu écris "x^" tout seul ... c'est pas trops compliqué, tu as un scanf qui foire qqpart va falloir que tu parses les polynômes de manière manuelle ... PS : dois aller faire un tour, suis de retour vers 16-17h Link to comment Share on other sites More sharing options...
Neo_13 Posted May 21, 2004 Author Share Posted May 21, 2004 l'utilisation de scanf dans saisir_monome est trop simpliste et pose des problèmes ... scan=scanf("%dx^%d",&(m->coef),&(m->puiss)); ce truc ne renvoie 0 que si tu écris "x^" tout seul ... c'est pas trops compliqué, tu as un scanf qui foire qqpart va falloir que tu parses les polynômes de manière manuelle ... Ca ca marche... (voir test_polynome.c qui fonctionne sans problème) et saisir un polynome c'est : ax^b+... et finir par n'importe quel caractère autre qu'un chiffre... ! par exemple le stress est dans soit le main de menu.c, soit dans menu() dans menu.c... puisque sans ça (il suffit de make test_polynome...) Link to comment Share on other sites More sharing options...
Angel Eyes Posted May 21, 2004 Share Posted May 21, 2004 j'oubliais, mets un mode d'emplois avec ... et le bug des menus est typique d'un scanf qui foire => memory leak ... mets un sleep(1) après choix=menu(); et tu verras, il répond tout seut au scanf ... PS : juste avant d'y aller, je me demande si ce n'est pas ton caractère pour terminer qui reste dans le buffer des scanf malgré les fflush(stdin) Link to comment Share on other sites More sharing options...
Neo_13 Posted May 21, 2004 Author Share Posted May 21, 2004 j'oubliais, mets un mode d'emplois avec ... et le bug des menus est typique d'un scanf qui foire => memory leak ... mets un sleep(1) après choix=menu(); et tu verras, il répond tout seut au scanf ... PS : juste avant d'y aller, je me demande si ce n'est pas ton caractère pour terminer qui reste dans le buffer des scanf malgré les fflush(stdin) ben je pense aussi mais si ca reste malgré le fflush(stdin) comment je peux le vider??? Link to comment Share on other sites More sharing options...
Neo_13 Posted May 21, 2004 Author Share Posted May 21, 2004 aux grands maux, les grands remedes... dans la fonction saisir_liste, je rajoute un getchar qui ne stocke sa valuer nulle part (j'm'en tape), ce qui a pour avantage de me vider mon buffer, et je suis tranquille... /** * saisir_liste * Permet de saisir une liste * * @param void * @return liste l la liste saisie */ liste saisir_liste() { monome m; liste l=NULL; puts("Entrez un polynome :"); while(saisir_monome(&m)!=0) l=ajouter(m,l); getchar() return l; } Link to comment Share on other sites More sharing options...
Angel Eyes Posted May 21, 2004 Share Posted May 21, 2004 pour commencer, tu fais un fngets(stdin) et tu mets le résultat dans un buffer, ce qui évitera de contaminer stdin, ensuite, tu utilise sscanf (au lieu de scanf) sur ce buffer ... prends tout en mémoire et travaille dessus, c'est plus propre ... ton getchar ne résoudra ptet pas le problème si tu as plusieurs caractères en suspend ... Link to comment Share on other sites More sharing options...
Neo_13 Posted May 21, 2004 Author Share Posted May 21, 2004 pour commencer, tu fais un fngets(stdin) et tu mets le résultat dans un buffer, ce qui évitera de contaminer stdin, ensuite, tu utilise sscanf (au lieu de scanf) sur ce buffer ... merci bien, je le note... mais pour l'instant mon getchar() remplis son office et ça fonctionne bien... du coup, je me suis rendu compte que la fonction stockage fonctionnait pas correctement : /** * stockage * Permet d'enregistrer le polynome temp (qui est le résultat d'un calcul) dans * p1, p2 ou p * * @param polynome p1 * @param polynome p2 * @param polynome p * @param polynome temp * @return void */ void stockage(polynome p1, polynome p2, polynome p, polynome temp) { int test1,test2; puts("Voulez-vous stocker ce résultat dans l'un des polynomes ?"); puts("1 - Oui\t2 - Non"); scanf("%d",&test1); if(test1==1) { puts("Si vous le stocker dans p1 ou p2,"); puts("ce résultat peut resservir dans l'un des calculs suivants."); puts("Dans lequel des polynomes voulez-vous stocker le résulat ?"); puts("1 - p1\t2 - p2\t3 - p"); scanf("%d",&test2); } else return; if(test2==1) p1=recopier(temp); if(test2==2) p2=recopier(temp); if(test2==3) p=recopier(temp); if(test2<1 || test2>3) { puts("Mauvais choix"); stockage(p1,p2,p,temp); } } Mais là encore, je vais debugger, et si vraiment je ne trouve pas, je passerais demander de l'aide... "C'est en résolvant des problèmes qu'on s'améliore... pas en lisant les solutions d'un autre..." et "La programmation, c'est par les doigts que ça rentre" merci bien à tous ceux qui m'ont aidé et j'espère que ce topic va plonger dans le forum (sinon, c'est que je galère vraiment trop, et ça me tente moyen ) Link to comment Share on other sites More sharing options...
Neo_13 Posted May 21, 2004 Author Share Posted May 21, 2004 et puis il faut que je fasse les fonctions de libération de mémoire... Link to comment Share on other sites More sharing options...
Neo_13 Posted May 21, 2004 Author Share Posted May 21, 2004 fais chier... Ca marche pas Bon je recommence.... alors, je fais passer dans une fonction 4 pointeurs, je recopie le contenu d'un dans un autre, et quand je retourne à la fonction principale, ben mes pointeurs n'ont pas changé... plus exactement, les valeurs de mes pointeurs... recopier a pour type polynome et a pour effet de retourner une copie d'un polynome qu'il faut alors stocker (d'où l'affectation p1=recopier(temp)) et fonctionne sans problème... pourquoi ca marche pas (ptetre simplement que j'ai tout faux en pensant que de modifier le contenu d'un pointeur dans une fonction le modifie dans les autres) Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.