[C] bug ?

Fermé
Chaos-man - 1 août 2004 à 15:08
Ravachol Messages postés 560 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 30 octobre 2005 - 2 août 2004 à 10:27
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

bebert55 Messages postés 1900 Date d'inscription mardi 16 décembre 2003 Statut Contributeur Dernière intervention 27 octobre 2004 174
1 août 2004 à 15:37
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.

Bertrand
0
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.
0
Hot Metal Messages postés 7 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 23 août 2004
1 août 2004 à 16:29
Salut

Il y a de bonne chance que ton programme corrompt la pile. Sans code source je ne peut pas t'en dire plus
0
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 ?*/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ravachol Messages postés 560 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 30 octobre 2005 120
1 août 2004 à 22:59
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
0
Salut, je confirme :-)
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+
0
Canard007 Messages postés 5929 Date d'inscription mercredi 26 mai 2004 Statut Contributeur Dernière intervention 18 septembre 2009 215
2 août 2004 à 09:41
return 0 par defaut veut dire que tout c'est bien passé dans la fonction et tou compilateur le reconnait. Comme return -1 veut dire qu'il y a une erreur trés util pour integrer des controle.
if(!mafonction) par exemple
si c'est 0 ca passe si c'est -1 ca passe pas
COIN!
0
erf, j'avais oublié que l'insertion de code provoquais des retour à la ligne :-/
0
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 ?
0
Kermitt31 Messages postés 3669 Date d'inscription jeudi 15 juillet 2004 Statut Contributeur Dernière intervention 8 août 2006 492
2 août 2004 à 10:01
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.
0
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) ?
0
Canard007 Messages postés 5929 Date d'inscription mercredi 26 mai 2004 Statut Contributeur Dernière intervention 18 septembre 2009 215
2 août 2004 à 10:20
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!
0
Ravachol Messages postés 560 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 30 octobre 2005 120
2 août 2004 à 10:27
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.
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
0