IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

[débutant] arret brutal du programme


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2006
    Messages : 33
    Par défaut [débutant] arret brutal du programme
    Bonjour, je tient a signaler que je suis un bon vrai débutant avec tout ce que celà implique

    Voici mon prog : (J'utilise Dev-C++ V4.9.9.2)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <stdio.h>
    #include <stdlib.h>
     
    int Somme;
     
    int main(void)
    {
                  int X;
                  int Y;
                  char Buff[10];
                  printf("Entrez un premier nombre entier : ");
                  gets(Buff);
                  X = atoi(Buff);
                  printf("Entrez un second nombre entier : ");
                  gets(Buff);
                  Y = atoi(Buff);
                  Somme = X + Y;
                  printf("La somme de %d et de %d est %d\n",X,Y,Somme);
                  return 0;
    }
    Alors quand je lance le programme par F9, une fenetre MS-DOS s'ouvre et me demande un premier nombre. J'ecris un chiffre au hasard, disons 5, je fais entrée pour valider; Ensuite on me demande un deuxieme chiffre, j'ecris au hasard 4, et à ce moment quand je fais entrée, la fenetre se ferme. Je n'ai pas la somme qui s'affiche...

    Quelqu'un à une idée du problème ???

    Merci par avance

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par ~Brouette~
    Voici mon prog : (J'utilise Dev-C++ V4.9.9.2)
    <...>
    Alors quand je lance le programme par F9, une fenetre MS-DOS s'ouvre et me demande un premier nombre. J'ecris un chiffre au hasard, disons 5, je fais entrée pour valider; Ensuite on me demande un deuxieme chiffre, j'ecris au hasard 4, et à ce moment quand je fais entrée, la fenetre se ferme. Je n'ai pas la somme qui s'affiche...
    Ce problème est bien connu et se résout ainsi : Désinstalle Dev-C++ et installe Code::Blocks à la place.

    http://www.codeblocks.org/

    A part ça, le code est correct, mais dangereux. Et attention à ton vocabulaire...

    • Il n'y a pas de 'fenêtre MS-DOS'. Il y a une 'console Windows'.
    • Les cas où les variables globales sont utiles sont très rares. Déplace la dans le main().
    • Il ne faut pas utiliser gets() qui est un bug bien connu. Utilise fgets() à la place.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Code::Blocks a de nombreux avantages sur Dev-C++, mais aussi quelques inconvénients.

    Le workaround pour Dev-C++ se trouve dans la FAQ :
    http://c.developpez.com/faq/c/?page=...onsole_windows
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Médinoc
    Code::Blocks a de nombreux avantages sur Dev-C++, mais aussi quelques inconvénients.
    Comme ?

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Comme ?
    Je n'ai plus utilisé Code::Blocks depuis un moment, mais j'avais vu:
    • Le refus de compiler des fichiers solitaires (appelle ça de la paresse si tu veux, mais seul Dev le permet)
    • L'arborescence du projet est grosse et hideuse
    • L'absence de séparation des flags supplémentaires entre C et C++ (et moi, j'ai pas mal de projets mixtes (mais un fichier source passe par un seul compilo, hein))
    • Des problèmes bizarres aussi dans la gestion des options (mais c'est assez flou dans ma mémoire)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Médinoc
    * Le refus de compiler des fichiers solitaires (appelle ça de la paresse si tu veux, mais seul Dev le permet)
    Normal, Mauvaise Pratique
    * L'arborescence du projet est grosse et hideuse
    Bah, elle est pas pire que celle de Visual C++... Et j'aime bien l'organisation automatique des fichiers par sources/headers/others. Et puis on peut avoir plusieurs projets sous la main, ce qui est très pratique.
    * L'absence de séparation des flags supplémentaires entre C et C++ (et moi, j'ai pas mal de projets mixtes (mais un fichier source passe par un seul compilo, hein))
    C'est possible, en effet... Est-ce vraiment génant ?
    * Des problèmes bizarres aussi dans la gestion des options (mais c'est assez flou dans ma mémoire)
    Attendons d'en savoir plus...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2006
    Messages : 33
    Par défaut
    Merci pour ta réponse

    Malheureusement je ne peu desinstaller dev-c++, je prend des cours par le cnam, et tous les "éleves" doivent utiliser ce logiciel pour faciliter les resolutions de problemes...

    J'ai remplacé gets par fgets dans mon code et du coup j'ai des erreurs qu is'affichent, le logiciel m'ouvre la bibliotheque stdio.h et me souligne cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _CRTIMP char* __cdecl	fgets (char*, int, FILE*);
    Sinon, pourquoi ce code est-il dangereux ?

    Merci pour vos reponses

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par ~Brouette~
    Sinon, pourquoi ce code est-il dangereux ?
    A cause de gets(). Il n'y a aucun moyen portable d'utiliser gets() sans créer un trou de sécurité dans le programme, étant donné qu'il n'y a pas de contrôle de taille. On peut toujours déborder du tableau de char et provoquer un comportement indéfini. Il suffit d'entrer une chaine assez longue...

    Cette faille bien connue est à l'origine de l'exploit dit du Great Internet Worm.

  9. #9
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Salut,

    Tout d'abord, quelques remarques générales sur ton programme:
    1. Utiliser gets(), c'est très mal d'un point de vue sécurisation du code. On ne doit pas utiliser gets(), mais fgets(char *s, int n, FILE *file).
    2. Pourquoi utilises-tu une variable globale pour Somme. Il n'y a aucune raison de le faire ici. D'ailleurs, on essaie également de ne jamais utiliser de variables globales. Les rares cas où tu ne peux pas faire autrement doivent être justifiés.
    3. Utilise plutôt strtol() que atoi().

    Ton programme sinon semble correct. Essaie de mettre de mettre à la fin de ton programme avant l'instruction return:
    C'est un problème assez classique sous windows. La console se ferme automatiquement dès la fin du programme. Si tu veux résoudre ce problème, utilise Code::blocks à la place de Dev-C++ (dont le développement a maintenant été arrete).

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  10. #10
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    D'autres ont été plus rapide que moi, cela m'apprendra à retourner 50 fois la langue dans ma bouche pour ne dire trop de bétises, et de relire 3x mon message avant de poster.

    En ce qui concerne Dev-C++ comparé à Code::Blocks, mes souvenirs sous Windows sont lointains, mais je trouve Code::Blocks très bien.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  11. #11
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    fgets te permet de lui indiquer la taille de Buff en deuxième paramètre, ce qui évite les débordement de tampon. Ainsi, fgets lira, si l'entrée de l'utilisateur est trop grande, les 9 premiers caractères sur le flux que tu lui indique en 3ème paramètre et placera un caractère nul à la fin de la chaîne.

    Un utilisation correcte de fgets dans ton cas est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgets(Buff, 10, stdin);
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2006
    Messages : 33
    Par défaut
    Citation Envoyé par mujigka
    fgets te permet de lui indiquer la taille de Buff en deuxième paramètre, ce qui évite les débordement de tampon. Ainsi, fgets lira, si l'entrée de l'utilisateur est trop grande, les 9 premiers caractères sur le flux que tu lui indique en 3ème paramètre et placera un caractère nul à la fin de la chaîne.

    Un utilisation correcte de fgets dans ton cas est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgets(Buff, 10, stdin);
    Thierry

    Cela fonctionne très bien effectivement...

    Y'a du boulot....

  13. #13
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par mujigka
    Un utilisation correcte de fgets dans ton cas est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgets(Buff, 10, stdin);
    Sous réserve que Buff soit un tableau (et non un pointeur), on préfèrera écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgets(Buff, sizeof Buff, stdin);
    ce qui rend le code 'auto-dém*rdant'.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2006
    Messages : 33
    Par défaut
    Citation Envoyé par mujigka
    Ton programme sinon semble correct. Essaie de mettre de mettre à la fin de ton programme avant l'instruction return:
    Thierry
    Merci Thierry, tout fonctionne correctement maintenant
    Merci aussi à tous ceux qui m'ont repondu, je pense que je vais devoir apprendre avec 2 logiciels en parrallele...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Arret brutal après execution de tous les programmes
    Par guismoman33 dans le forum Windows XP
    Réponses: 1
    Dernier message: 15/09/2009, 19h45
  2. Réponses: 11
    Dernier message: 12/12/2006, 00h53
  3. [Débutant] Optimisation d'un programme
    Par velociraptor5679 dans le forum C++
    Réponses: 20
    Dernier message: 19/06/2006, 21h38
  4. [LG] Arrêter complètement un programme pascal
    Par piff62 dans le forum Langage
    Réponses: 2
    Dernier message: 02/12/2005, 13h50
  5. Réponses: 7
    Dernier message: 24/01/2005, 11h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo