[C] bug ?
Chaos-man
-
Ravachol Messages postés 566 Date d'inscription Statut Membre Dernière intervention -
Ravachol Messages postés 566 Date d'inscription Statut Membre Dernière intervention -
J'ai un léger problème : lorsque je compile un programme C avec Dev C++, le programme fait ce qu'il a à faire puis lorsqu'il arrive à return 0; il plante : une fenêtre s'ouvre (je suis sous WinXP) et me demande si je veux envoyer un rapport d'erreur car le programme a planté et windows a dû le fermer... D'où vient le problème ?
10 réponses
Salut
Si tu as ceci dès que tu compiles un programme, tente une réinstallation de dev-cpp pour voir si le problème persiste.
Si tu as ceci dès que tu compiles un programme, tente une réinstallation de dev-cpp pour voir si le problème persiste.
Bertrand
Non ce n'est pas quand je le compile c'est à la fin de l'exécution, quand le prog atteint le return 0; que ça plante.
Salut
Il y a de bonne chance que ton programme corrompt la pile. Sans code source je ne peut pas t'en dire plus
Il y a de bonne chance que ton programme corrompt la pile. Sans code source je ne peut pas t'en dire plus
Voila le code source :
#include <stdio.h>
main()
{
jeu();
return 0;
}
/*fin de la fonction main*/
/*début de la fonction jeu*/
jeu()
{
short essai = 0; /*déclaration des variables utiles au jeu*/
short nombreSecret= 1743;
short compteur=1;
short fin=0;
Label : printf("\nJe pense a un nombre entre 1 et 5000. Essayez de le deviner : ");
scanf(" %d", &essai);
while(essai!=nombreSecret)
{
if(essai<nombreSecret)
{
printf("\nLe nombre propose est trop petit.\n");
compteur++;
}
else
{
printf("\nLe nombre propose est trop grand.\n");
compteur++;
}
goto Label;
}
printf("\nBRAVO ! Vous avez trouve le Nombre Mystere en %d coups.", compteur);
scanf("&d", fin);
}
/*normalement, retour à la fonction main() et donc à return 0; mais là ça marche pas ?*/
#include <stdio.h>
main()
{
jeu();
return 0;
}
/*fin de la fonction main*/
/*début de la fonction jeu*/
jeu()
{
short essai = 0; /*déclaration des variables utiles au jeu*/
short nombreSecret= 1743;
short compteur=1;
short fin=0;
Label : printf("\nJe pense a un nombre entre 1 et 5000. Essayez de le deviner : ");
scanf(" %d", &essai);
while(essai!=nombreSecret)
{
if(essai<nombreSecret)
{
printf("\nLe nombre propose est trop petit.\n");
compteur++;
}
else
{
printf("\nLe nombre propose est trop grand.\n");
compteur++;
}
goto Label;
}
printf("\nBRAVO ! Vous avez trouve le Nombre Mystere en %d coups.", compteur);
scanf("&d", fin);
}
/*normalement, retour à la fonction main() et donc à return 0; mais là ça marche pas ?*/
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut,
c'est le dernier scanf qui produit l'erreur : scanf("&d", fin);
Modifie le de cette façon : scanf("%d", &fin);
Et puis juste une proposition, remplace ta boucle while par un do while en integrant le prompt et la saisie du nombre dans cette boucle, ceci te permettra d'enlever le goto Label. En effet les goto cassent, en général, la structure d'un prog et ils sont à éviter au maximum.
A++
La pensée ne commence qu'avec le doute.
ROGER MARTIN DU GARD
c'est le dernier scanf qui produit l'erreur : scanf("&d", fin);
Modifie le de cette façon : scanf("%d", &fin);
Et puis juste une proposition, remplace ta boucle while par un do while en integrant le prompt et la saisie du nombre dans cette boucle, ceci te permettra d'enlever le goto Label. En effet les goto cassent, en général, la structure d'un prog et ils sont à éviter au maximum.
A++
La pensée ne commence qu'avec le doute.
ROGER MARTIN DU GARD
Salut, je confirme :-)
J'ajouterais un "détail" : quel est le type de tes fonctions ?
a+
J'ajouterais un "détail" : quel est le type de tes fonctions ?
return 0;n'a pas vraiment de sens si on ne sait pas ce qu'est ce "0" (char? int ? double ? etc. etc). Il me semble que dans ce cas le compilateur considère que c'est un int, mais c'est une pratique à éviter à mon humble avis. Si tu ne te préocupes pas du retour, utilise le type void (pas de retour) et donc supprime le
return 0;.
a+
Vous pouriez me donner un exemple de boucle do while, je la connais pas (je l'ai dit, je suis débutant :-S)...
Et return 0; c'est pas sensé être une instruction qui renvoie 0 au compilateur, pour qu'il "comprenne" que le programme est fini ?
Et return 0; c'est pas sensé être une instruction qui renvoie 0 au compilateur, pour qu'il "comprenne" que le programme est fini ?
do
{
liste des actions a executer
}
while (condition pour rester dans la boucle)
voila... c tres simple a utiliser...
Moi ce que je trouve bizarre dans ton return(0) c'est que tu le fais dans ta fonction main et que tu n'a pas doné de type de retour... int main() par exemple
Proverbe Thaïlandais:Pingouins dans les champs,
hiver très méchant.
{
liste des actions a executer
}
while (condition pour rester dans la boucle)
voila... c tres simple a utiliser...
Moi ce que je trouve bizarre dans ton return(0) c'est que tu le fais dans ta fonction main et que tu n'a pas doné de type de retour... int main() par exemple
Proverbe Thaïlandais:Pingouins dans les champs,
hiver très méchant.
Hum... Quelle est la différence entre une boucle while et une boucle do while ?
De plus comment définir le type de retour ? Je croyais que ça envoyait juste 0 (ou -1 apparemment quand il y a eu un problème) ?
De plus comment définir le type de retour ? Je croyais que ça envoyait juste 0 (ou -1 apparemment quand il y a eu un problème) ?
la boucle while verifie ta condition avant d'executer le code qu'elle contient alors que la boucle do while execute une premiere fois le code puis verifie la condition avant de recommencer.
le type de retour 0 ou -1 suffit amplement dans le cas de ta fonction..
dans les cas ou le retour est "plus complex" la tu peut renvoyer des entier chaines de caracteres pointeurs structures etc...
et la tu definira toi meme tes "codes" error/success
COIN!
le type de retour 0 ou -1 suffit amplement dans le cas de ta fonction..
dans les cas ou le retour est "plus complex" la tu peut renvoyer des entier chaines de caracteres pointeurs structures etc...
et la tu definira toi meme tes "codes" error/success
COIN!
Salut,
voici une des nombreuses façons d'adapter ton prog à une boucle do while.
Si tu n'utilise pas le code de retour autant mettre void (rien) en type de retour.
A++
La pensée ne commence qu'avec le doute.
ROGER MARTIN DU GARD
voici une des nombreuses façons d'adapter ton prog à une boucle do while.
Si tu n'utilise pas le code de retour autant mettre void (rien) en type de retour.
void main() { jeu(); } //fin de la fonction main //début de la fonction jeu void jeu() { short essai = 0; //déclaration des variables utiles au jeu short nombreSecret= 1743; short compteur=0; char fin; do { printf("\nJe pense a un nombre entre 1 et 5000. Essayez de le deviner : "); scanf(" %d", &essai); compteur++; if(essai==nombreSecret) { printf("\nBRAVO ! Vous avez trouve le Nombre Mystere en %d coups.\n", compteur); } else if (essai<nombreSecret) { printf("\nLe nombre propose est trop petit.\n"); } else { printf("\nLe nombre propose est trop grand.\n"); } printf("[A] pour sortir, [Entrée] pour continuer ?"); flush(stdin); // Vide le buffer clavier fin=getchar(); }while(fin!='A'); }
A++
La pensée ne commence qu'avec le doute.
ROGER MARTIN DU GARD