Aller au contenu

[nouveau prob en page 2]Sais-je encore coder en C


Neo_13

Messages recommandés

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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");
 	}
 }
}
}

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 ...

:reflechis:

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...)

Lien vers le commentaire
Partager sur d’autres sites

j'oubliais, mets un mode d'emplois avec ... :reflechis:

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)

Lien vers le commentaire
Partager sur d’autres sites

j'oubliais, mets un mode d'emplois avec ... :francais:

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???

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 ...

Lien vers le commentaire
Partager sur d’autres sites

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 :francais: )

Lien vers le commentaire
Partager sur d’autres sites

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)

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...