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 :

Ou est mon erreur?


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Chomeur
    Inscrit en
    Janvier 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Janvier 2017
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Ou est mon erreur?
    Bonjour,

    J'apprend le c++ depuis quelques jours maintenant et je suis bloqué a un exercice "de base" . J'ai réussi a corriger toutes les erreurs qu'a repérer codeblocks mais mon projet ne fait toujours pas ce que je voudrais. Je m'explique.

    J'aimerais que mon "logiciel" face ceci: On rentre la largeur et la hauteur d'un rectangle puis son nom. Le logiciel "dessine" ensuite un rectangle avec des * (jusque la, mon logiciel fonctionne). Mais, j'aimerais que si l'on rentre une largeur ou une hauteur négative, le logiciel affiche un message du style "Vous ne pouvez pas rentrer de données négatives".

    Et c'est la que ca se gatte, quoi que je face désormais, mon logiciel m'indique mon message d'erreur. Ca vient surement de la ligne de code 31 mais je n'arrive pas a voir ou est mon erreur. HELP!



    Je met juste un lien de l'image au cas ou j'ai ratée l’Aperçu: http://image.noelshack.com/fichiers/...e-exercice.png

    Merci infiniment de votre lecture!

    Ps: il n'y a pas moyen de publier des lignes de code sans avoir a faire de capture d’écran?

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Tu réalises tes tests sur des entiers non signés (cf. déclaration ligne 21), donc contraints sur l'intervalle [0..UINT_MAX]. Active bien tous les warnings de ton compilateur, c'est en règle générale quelque chose qu'il est capable de détecter.

    Citation Envoyé par JoanDeulofeu Voir le message
    Ps: il n'y a pas moyen de publier des lignes de code sans avoir a faire de capture d’écran?
    Copier-coller ton code entre balises [ code ] ... [/ code ] (sans les caractères d'espacement).

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    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 195
    Points : 17 163
    Points
    17 163
    Par défaut
    réponse à ton ps: Si, il suffit de coller le code dans une balise [code] (le bouton #). Ou pour quelques mots, il y a [c] ou [codeinline]

    Réponse à ta question:
    Quel est le type de tes variables?

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mai 2014
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 227
    Points : 162
    Points
    162
    Par défaut
    On va surement te le dire plusieurs fois donc je me permet d'afficher directement le code en format texte :

    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
     
    int main()
    {
       unsigned int largeur(0), hauteur(0);
       string nomFigure("sans nom");
     
       cout << "Quelle est sa largeur ?" << endl;
       cin >> largeur;
       cout << "Quelle est sa hauteur ?" << endl;
       cin >> hauteur;
       cout << "Quel nom voulez vous donner a votre rectangle ?" << endl;
       cin >> nomFigure;
     
       if (largeur <= -1)
       {
          cout << "La largeur doit etre positive." << endl;
       }
       else if(hauteur <= -1)
       {
          cout <<"La hauteur doit etre positive." << endl;
       }
       else
       {
          creerRectangle(largeur, hauteur, nomFigure);
       }
     
       return 0;
    }
    Ton code fonctionne bien, tu peux aussi simplifier de la sorte si tu n'as qu'une instruction après ton if :

    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
     
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        unsigned int largeur{0} hauteur{0};
        string nomFigure{"Sans nom"};
     
        cout << "Quelle est sa largeur ?" << endl;
        cin >> largeur;
        cout << "Quelle est sa hauteur ?" << endl;
        cin >> hauteur;
        cout << "Quel nom voulez vous donner a votre rectangle ?" << endl;
        cin >> nomFigure;
     
        if( largeur < 0 )
            cout << "La largeur doit etre positive." << endl;
        else if( hauteur < 0 )
            cout << "La hauteur doit etre positive." << endl;
        else
            creerRectangle(largeur, hauteur, nomFigure);
     
       return 0;
    }
    Et chez moi il n'y a aucune erreur car j'ai désactiver certain paramètre mais en soit, n'utilisa pas d'unsigned int, utilise un int car, unsigned int ( entier signé ) ne te permet que de stocker des nombres positif ou une valeur nul. Donc le fait de faire un comparaison de la sorte doit surement t'afficher des erreurs

  5. #5
    Candidat au Club
    Homme Profil pro
    Chomeur
    Inscrit en
    Janvier 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Janvier 2017
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    Tu réalises tes tests sur des entiers non signés (cf. déclaration ligne 21), donc contraints sur l'intervalle [0..UINT_MAX]. Active bien tous les warnings de ton compilateur, c'est en règle générale quelque chose qu'il est capable de détecter.
    Alors je vais peut être passer pour un idiot mais je débute et j'ai pas tout compris. Ça veut dire quoi " contraints sur l'intervalle [0..UINT_MAX] " ? Je réalise mes tests sur des "unsigned int" car je veux que l'utilisateur puisse rentré des nombres positifs OU négatifs. Du coup, je suis bien obliger de m’être "unsigned int", non?

    Sinon, voici le code entier du 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
     #include <iostream>
     
    using namespace std;
     
    void creerRectangle (int l, int h, string nomFigure)
    {
        for (int hauteur(0); hauteur< h; hauteur++)
        {
     
            for (int largeur(0); largeur< l; largeur++)
            {
            cout << "*";
            }
            cout << endl;
        }
        cout << nomFigure << " est terminer! C'est merveilleux." << endl;
    }
     
    int main()
    {
        unsigned int largeur(0), hauteur(0);
        string nomFigure("sans nom");
     
        cout << "Quelle est sa largeur ?" << endl;
        cin >> largeur;
        cout << "Quelle est sa hauteur ?" << endl;
        cin >> hauteur;
        cout << "Quel nom voulez vous donner a votre rectangle ?" << endl;
        cin >> nomFigure;
     
        if (largeur < 0 )
        {
            cout << "La largeur doit etre positive." << endl;
        }
        else if (hauteur < 0 )
        {
            cout << "La hauteur doit etre positive." << endl;
        }
        else
        {
            creerRectangle(largeur, hauteur, nomFigure);
        }
     
        return 0;
    }
    Et comment activer tout les warnings aussi stp? ^^

  6. #6
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Non justement, les entiers non signés (sans signe, donc) modélisent une partie de l'ensemble des entiers naturels. Lorsqu'on les convertit en entiers relatifs ils correspondent donc à des nombres positifs ou nuls. Ici tu as besoin au contraire d'entiers signés, ce qui est le comportement par défaut (lorsqu'unsigned n'est pas précisé). Si tu veux être explicite tu peux ajouter le mot-clef signed.

    Citation Envoyé par JoanDeulofeu Voir le message
    Alors je vais peut être passer pour un idiot
    Certainement pas, lis la dernière maxime de la signature de ternel au-dessus.


    Citation Envoyé par JoanDeulofeu Voir le message
    Et comment activer tout les warnings aussi stp? ^^
    Ça, ça dépend de ton compilateur / IDE ; je te laisse te référer à sa documentation ou chercher en ligne. Avec GCC / CLang on peut choisir de spécifier, par exemple, -Wall -Wextra.

  7. #7
    Candidat au Club
    Homme Profil pro
    Chomeur
    Inscrit en
    Janvier 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Janvier 2017
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    Non justement, les entiers non signés (sans signe, donc) modélisent une partie de l'ensemble des entiers naturels. Lorsqu'on les convertit en entiers relatifs ils correspondent donc à des nombres positifs ou nuls. Ici tu as besoin au contraire d'entiers signés, ce qui est le comportement par défaut (lorsqu'unsigned n'est pas précisé). Si tu veux être explicite tu peux ajouter le mot-clef signed.
    D'ACCORD !!!! J'ai pas compris ca quand j'ai appris les types de variables! Merci beaucoup de votre aide, ça fait au moins 4 heures que je galèrais.

    Ca y est du coup, mon programme marche , merci encore!

  8. #8
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 719
    Points : 43 820
    Points
    43 820
    Par défaut
    Pour t'expliquer la différence entre signed et unsigned int :

    Je pars du postulat qu'un int est codé sur 16 bits. Tu as donc 2 puissance 16 valeurs possibles soit 65536 (2 car en binaire on a 0 ou 1 comme valeurs possible pour 1 bit). Les valeurs possibles seront donc de 0 à 65535.

    Parlons des nombres négatifs maintenant. Une convention a été mise en place pour utiliser le bit de poids fort (le bit le plus à gauche) pour gérer le signe 0 : nombre positif 1 :nombre négatif.

    Il ne te reste donc plus que 15 bits pour le nombre ->2 puissance 15=32768 valeurs possibles.
    donc les valeurs possible seront de 0 à 32767 ou de -32767 à -0, ce qui donne -32767 à 32767. Je montre le -0, car en informatique, il existe et est équivalent à 0 même si il n'a pas de sens en mathématique pure.

    Pour indiquer qu'on travaille en arithmétique non signé (ce qui signifie sans signe, donc positif), on utilise un unsigned int, ça veut dire que sans précision, on est en arithmétique signé.

    Cela avait une très grosse importance avant, ou l'on avait pas beaucoup de mémoire, et ou en était limité à 16 bits. Cela en a moins maintenant ou on a des processeurs 64 bits, et des registres 128 ou 256 bits pour les instructions CPU SSE

    Je pense qu'un int est maintenant sur 32 bits, à vérifier au niveau norme.

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    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 195
    Points : 17 163
    Points
    17 163
    Par défaut
    Pour la petite information, on parle de nombre "signed" quand il a un bit de signe (il est signé), et "unsigned" quand il n'en a pas.

  10. #10
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    Parlons des nombres négatifs maintenant. Une convention a été mise en place pour utiliser le bit de poids fort (le bit le plus à gauche) pour gérer le signe 0 : nombre positif 1 :nombre négatif.
    Non et oui, les entiers relatifs sont codés en complément à deux (où (~0) == (-1) est vérifié) dans la très grande majorité des cas.


    Citation Envoyé par chrtophe Voir le message
    donc les valeurs possible seront de 0 à 32767 ou de -32767 à -0, ce qui donne -32767 à 32767. Je montre le -0, car en informatique, il existe et est équivalent à 0 même si il n'a pas de sens en mathématique pure.
    Pour la même raison, on n'a en règle générale qu'un seul codage de zéro et une borne négative décalée de -1 (de -32768 à 32767 pour 16 bits, par exemple). Mais la distinction entre zéro positif et zéro négatif est faite pour les nombres à virgule flottante IEEE 754.


    Citation Envoyé par chrtophe Voir le message
    Cela avait une très grosse importance avant, ou l'on avait pas beaucoup de mémoire, et ou en était limité à 16 bits. Cela en a moins maintenant ou on a des processeurs 64 bits, et des registres 128 ou 256 bits pour les instructions CPU SSE
    Débat récurrent encore évoqué ici : http://www.developpez.net/forums/d16...rs-non-signes/ . Je pense que déclarer un entier signé pour une taille de buffer ou un index n'est pas très rigoureux, d'autres sont en désaccord.

    Je ne vois pas trop ce que vient faire la taille des registres SSE ici, en revanche.


    Citation Envoyé par chrtophe Voir le message
    Je pense qu'un int est maintenant sur 32 bits, à vérifier au niveau norme.
    La norme ne précise que la taille minimale d'un int, qui est de 16 bits. Lorsqu'une taille donnée est requise, il convient d'utiliser les types fixés C99.

  11. #11
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 719
    Points : 43 820
    Points
    43 820
    Par défaut
    Je ne vois pas trop ce que vient faire la taille des registres SSE ici, en revanche.
    C'était juste pour illustrer l'évolution de la taille des registres CPU, aucun intérêt en C effectivement.

    La norme ne précise que la taille minimale d'un int, qui est de 16 bits. Lorsqu'une taille donnée est requise, il convient d'utiliser les types fixés C99.
    Sous mon Linux noyau 3.2.0-4-486, gcc 4.7.2 le code suivant me retourne 4 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%d",sizeof(int));
    4 octets, donc 32 bits.

    Après je ne sais pas quelle norme j'utilise, celle par défaut de mon système, et de toute façon je ne les connais pas et ne les suis pas, je code très peu, ce n'est pas mon métier. Cela fait ressortir un aspect intéressant pour un débutant : être capable de connaitre les limites des variables.
    @JoanDeulofeu : le code que j'ai mis te permet de connaitre le nombre d'octets qu'occupe une variable (on en déduit donc le nombre de bits). Si tu remplace int par unsigned int tu auras le même nombre d'octets occupés.

    Il y a aussi la constante MAX_INT qui retourne le plus grand nombre int possible. chez moi ça retourne 2147483647 (car comme vu plus haut sur ma machine un int est codé sur 32 bits), soit en binaire une suite de 31 bits à 1, on voit bien que le 32ème bit n'est pas utilisé, because réservé au signe.

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

Discussions similaires

  1. Débutant, quelle est mon erreur ?
    Par vladimire dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 15/05/2009, 23h43
  2. [VC#] - Je ne comprends pas ou est mon erreur !
    Par epc dans le forum Windows Forms
    Réponses: 32
    Dernier message: 03/11/2008, 19h10
  3. Où est mon erreur ?
    Par diaruga dans le forum C#
    Réponses: 6
    Dernier message: 04/08/2008, 11h56
  4. [MySQL] Mais ou est mon erreur de syntax?
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 07/10/2006, 15h59
  5. Où est mon erreur ?
    Par Fusio dans le forum Langage
    Réponses: 5
    Dernier message: 07/04/2006, 17h29

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