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 :

bug dans programme en c++


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 61
    Points : 40
    Points
    40
    Par défaut bug dans programme en c++
    Bonjour

    Pour m'exercer en c++, j'ai essayé d'écrire un petit programme pour dessiner des rectangles.

    La fonction «main» sert à me demander si je veux dessiner un rectangle.
    La fonction «demandeLongHaut» sert à me demander la longueur, et la hauteur du rectangle.
    La fonction «dessin» sert à dessiner le rectangle.
    La fonction «continuer» sert à me demander si je veux dessiner un nouveau rectangle.

    Le programme est buggé mais je ne sais pas d’où ça vient.

    Voici le programme:
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    #include <iostream>
     
    using namespace std;
     
    void dessin(int l,int h)
    {
        for(int ligne(0);ligne<h;ligne++)
            {
            for (int d(0);d<l;d++)
            {
            cout <<"*";
            }
        cout << endl;
        continuer();
    }
     
    void demandeLongHaut()
    {
          cout<<"largeur?"<<endl;
          int larg;
          cin>>larg;
          cout<<"hauteur?"<<endl;
          int haut;
          cin>>haut;
          dessin(larg,haut);
    }
     
    void continuer()
    {
    cout<< "voulez vous redessiner un rectangle? oui = o non = n";
              string r;
              cin >>r;
              switch(r)
              {
                  case o:
                    demandeLongHaut();
                    break;
                  case n:
                    return;
                    break;
                  default:
                    cout <<"cette option n'est pas reconue";
                    continuer();
                    break;
              }
    }
     
    int main()
    {
    cout<< "voulez vous dessiner un rectangle? oui = o non = n"<<endl;
              char r;
              cin >>r;
              switch(r)
              {
                  case o:
                    demandeLongHaut();
                    break;
                  case n:
                    return;
                    break;
                  default:
                    cout <<"cette option n'est pas reconue"<<endl;
                    main();
                    break;
              }
    }
    Voici le raport de gcc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ||=== Build: Debug in exercice (compiler: GNU GCC Compiler) ===|
    C:\Users\moi\Documents\c++\exercice\main.cpp||In function 'void dessin(int, int)':|
    C:\Users\moi\Documents\c++\exercice\main.cpp|14|error: 'continuer' was not declared in this scope|
    C:\Users\moi\Documents\c++\exercice\main.cpp|18|error: a function-definition is not allowed here before '{' token|
    C:\Users\moi\Documents\c++\exercice\main.cpp|29|error: a function-definition is not allowed here before '{' token|
    C:\Users\moi\Documents\c++\exercice\main.cpp|66|error: expected '}' at end of input|
    ||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
    Pouvez vous m'aider s'il vous plaît?

    Merci

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Revois l'indentation car il manque une accolade fermante dans la boucle.

    Concernant l'erreur sur la fonction continuer non déclarée, il faut déclarer la fonction avant de l'utiliser. S'il n'y a pas de déclaration de fonction avant son utilisation, le compilateur ne peut pas la connaître et émet une erreur.

    Si tu ne veux qu'un caractère ('o' ou 'n'), alors n'utilise pas std::string mais un char dans la demande de continuation.

    C'est case 'o': ... et pas case o: ....

    int pour des longueurs n'est pas un type approprié, comme une longueur ne pas être négative, il vaut mieux utiliser un non signé (unsigned).

    dessin fait beaucoup plus que dessiner un rectangle, elle appelle continuer alors que ce n'est pas son rôle. Idem pour demanderLongHaut.

    Tu remarques aussi que main et continuer font la même chose à une chaîne de caractère près. Chaîne qui peut être passée en paramètre de fonction.

    continuer pour être fait sous forme d'une boucle.

    On ne doit jamais appeler la fonction main directement.

  3. #3
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Salut,

    Il vaut mieux ajouter une forward déclaration. Tu ne peux pas mettre la fonction void continuer() avant les deux autres tout simplement parce que tu as une dépendance cyclique : dessin() -> continuer() -> demanderHautLong() -> dessin() -> contin..... etc
    Pour briser cette dépendance on utilise la forward déclaration.

    Ajoute juste void continuer(); avant ta fonction void dessin() ceci permet de dire au compilateur que tu as une fonction void continuer() qui existe. Le compilateur acquiescera et compilera.
    Par contre si tu n'ajoute pas ta fonction void continuer() après, avec son corps{...}, de mémoire tu aura une erreur au moment de l'édition de lien ( fait le test de compiler en commentant la fonction void continuer() mais en laissant la forward déclaration pour bien comprendre de quoi je parle)
    Homer J. Simpson


  4. #4
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Une forward déclaration concerne les classes, pas les fonctions. Les fonctions ont des prototypes (déclaration) et des implémentations (définition).

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    C'est un choix de vocabulaire.
    Il s'agit bien de déclarer sans définir. Ici, une fonction.
    Et de même, pour une variable, on utiliserait la syntaxe extern int i;.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Attention au passage, cette dépendance cyclique est mauvaise: Tu emploies de la récursivité là où une simple boucle serait plus appropriée. C'est censé être un programme d'exercice, pas une pièce de l'International Obfuscated C Code Contest.
    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.

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/03/2012, 10h32
  2. [XL-2007] Bug dans l’initialisation du programme
    Par Galere05 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 08/06/2011, 12h48
  3. bug dans mon programme (message d'erreur)
    Par maxmarie dans le forum Windows Mobile
    Réponses: 10
    Dernier message: 13/09/2007, 10h34
  4. Bug dans un programme sous 13H
    Par tixweb dans le forum Windows
    Réponses: 4
    Dernier message: 09/11/2006, 08h46
  5. bug dans programme d'extraction de données d'une page web
    Par youpimevla dans le forum Web & réseau
    Réponses: 11
    Dernier message: 31/08/2006, 10h02

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