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 :

Tableau de booléens


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Tableau de booléens
    Bonjour à tous ,
    je suis étudiant en informatique et j'ai reçu un code dans le cours que je n'arrives pas à comprendre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <iostream>
    using namespace std;
     
    int main() {
             unsigned r { 4 };
             bool * s { new bool [r] { true, true } };
             for (unsigned u = 0; u < r; ++u) {
                       cout << s[u] << " ";
         }
    }
    Le résultat affiché est : 1 1 "chiffre aléatoire" 0
    Je comprend les deux 1 car c'est true qui est initialisé mais je ne comprend pas pourquoi le troisième chiffre est automatiquement un nombre aléatoire et pourquoi le quatrième prend une valeur logique qui est 0 car un booléen non initialisé se met à false ( donc 0 ). Donc si quelqu'un peut m'expliquer ce code ça serait sympa

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Bonjour,

    Pour moi, le code me semble bizarre, car il y a des accolade à la place de certaines parenthèses.
    Sinon, la cellule 3 et 4 ne sont pas initialisé d'après moi. Que cela tombe sur zéro est de la chance. Et il y a une fuite de mémoire.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Citation Envoyé par Catsooo Voir le message
    je ne comprend pas pourquoi le troisième chiffre est automatiquement un nombre aléatoire et pourquoi le quatrième prend une valeur logique qui est 0 car un booléen non initialisé se met à false ( donc 0 ). Donc si quelqu'un peut m'expliquer ce code ça serait sympa
    Un booléen non-initialisé ne se met à rien du tout, il a une valeur aléatoire. Donc la valeur que tu récupères dépendra de :
    - détails d’implémentation
    - l’état de ta mémoire

    Pas grand chose d’intéressant à en tirer, sauf si tu t’intéresse au fonctionnement interne de ton compilateur. Pour info, chez moi les deux valeurs (3 et 4) sont à zéro.

    Sinon, quelques remarques sur le code en question :
    - la syntaxe, bien que valide, est peu usuelle. On préfère plutôt écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    unsigned int r = 4;
    bool* s = new bool[r]{ true, true};
    - utiliser des initializer-lists avec un tableau de taille variable génère un warning chez moi. C’est logique, le compilateur ne peut pas vérifier que le tableau cible a bien une taille suffisante, ce qui est susceptible de poser de gros problèmes.
    - comme l’a fait remarquer littlewhite, il y a une fuite mémoire.

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 209
    Points
    23 209
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Pour moi, le code me semble bizarre, car il y a des accolade à la place de certaines parenthèses.
    la syntaxe, bien que valide, est peu usuelle
    Si je ne me trompe pas, ceci est une nouveautés du C++11, on peut remplacer les parenthèses des constructeurs par des accolades.
    Ce n'est donc pas valide en C++99 par exemple.

    Attention à la petite nuance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct myclass {
      myclass (int,int);
      myclass (initializer_list<int>);
      /* definitions ... */
    };
     
    myclass foo {10,20};  // calls initializer_list ctor
    myclass bar (10,20);  // calls first constructor

    cf http://www.cplusplus.com/reference/i...tializer_list/

  5. #5
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Si je ne me trompe pas, ceci est une nouveautés du C++11, on peut remplacer les parenthèses des constructeurs par des accolades..
    C++11 amène bien l'initialisation uniforme.

    Citation Envoyé par Neckara Voir le message
    C++99
    C++98, C++03, C++11, C++14, C++17, ...

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 209
    Points
    23 209
    Par défaut
    Citation Envoyé par Ehonn Voir le message
    C++98, C++03, C++11, C++14, C++17, ...
    Ah... je confonds avec le C :
    C89/90, C99, C11.

    Je dis pas mal de bêtises ces derniers temps .

  7. #7
    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
    Donc si j'ai bien compris, en C++11, on a droit à une instanciation du type:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    bool* pTab = new bool[4] { true, true };
    Mais contrairement à bool tab[4] = {true, true};, cela n'initialise pas les valeurs restantes?
    (probablement sur le même principe qu'un tableau dynamique de POD n'est jamais initialisé automatiquement)
    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.

  8. #8
    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
    Je ne suis pas d'accord. Si le tableau est initialisé, les valeurs non initialisés le seront avec {} ; false pour un booléen, 0 pour un int, etc.

    new bool[4]; : pas initialisé
    new bool[4] {}; : 0 0 0 0
    new bool[4] { true, true }; : 1 1 0 0

    Que le 4 soit dynamique ou pas.

  9. #9
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Citation Envoyé par jo_link_noir Voir le message
    Je ne suis pas d'accord. Si le tableau est initialisé, les valeurs non initialisés le seront avec {} ; false pour un booléen, 0 pour un int, etc.

    new bool[4]; : pas initialisé
    new bool[4] {}; : 0 0 0 0
    new bool[4] { true, true }; : 1 1 0 0

    Que le 4 soit dynamique ou pas.
    Je confirme. C’est bien ce que dit ma version de la norme (§ 8.5.1 et suivants). J’ai tendance à oublier que le compilateur initialise certaines valeurs dans certains contextes (c’est tellement moins grave de se tromper dans ce sens là que je préfère toujours initialiser explicitement).

  10. #10
    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
    Alors comment expliquer les résultats obtenus par catsooo?
    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.

  11. #11
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Cela dépend du compilateur, des optimisations (ou mode débogage) et du système, je pense.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  12. #12
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Peut-être que le compilateur n'est pas full C++11 et ne fait pas la partie implicite de l'initialisation? C'est lequel?

  13. #13
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 042
    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 042
    Points : 2 232
    Points
    2 232
    Par défaut
    Je comprend les deux 1 car c'est true qui est initialisé mais je ne comprend pas pourquoi le troisième chiffre est automatiquement un nombre aléatoire et pourquoi le quatrième prend une valeur logique qui est 0 car un booléen non initialisé se met à false ( donc 0 ). Donc si quelqu'un peut m'expliquer ce code ça serait sympa
    Normalement les deux derniers doivent être aléatoire. que tu obtiennes 0 est un pur hazard.

    Cela dépend du compilateur, des optimisations (ou mode débogage) et du système, je pense.
    L'initialisation est une fantaisie de compilateur si c'est le cas, certains set à 0 (peut-être) d'autre le set rien (prend la valeur qui est déjà dans la mémoire).
    Mais le compilateur qui set à 0 sans que l'on lui demande... Ça doit être une option (optimisation?)

    Je me rappelle de mémoire avoir eu un truc similaire en debug et release. En Debug, les valeurs était par defaut à 0, en release non (Sous visual express 2008 de mémoire)

    Il n'est pas normal qu'un compilateur initialise pour nous une valeur sans que l'on lui demande explicitement.
    Homer J. Simpson


  14. #14
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Citation Envoyé par Astraya Voir le message
    Normalement les deux derniers doivent être aléatoire. que tu obtiennes 0 est un pur hazard
    cf + haut, c++11 est censé initialiser à la valeur par défaut quand on n'initialise explicitement que certains éléments.

  15. #15
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 042
    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 042
    Points : 2 232
    Points
    2 232
    Par défaut
    cf + haut, c++11 est censé initialiser à la valeur par défaut quand on n'initialise explicitement que certains éléments.
    Oups... J'ai lu en diagonal, je n'ai pas encore eu l'occasion d'utiliser les list initializer.
    Mais dans ce cas là, il ne devrait pas avoir de valeur aléatoire dans s[2]....
    Est-ce que le résultat est le même sans l'allocation dynamique?
    Homer J. Simpson


Discussions similaires

  1. Réponses: 3
    Dernier message: 22/12/2008, 11h05
  2. Transformer tableau de booléens en une variable héxadécimale
    Par H3bus dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 09/12/2008, 16h52
  3. [WD10] Indice 1 d'un tableau de booléen
    Par agbononamour dans le forum WinDev
    Réponses: 2
    Dernier message: 13/11/2008, 11h06
  4. Comment passer un tableau de booléens dans IB ?
    Par colorid dans le forum Bases de données
    Réponses: 0
    Dernier message: 22/11/2007, 19h26
  5. Créer un tableau de booléens
    Par babylone_59 dans le forum Ada
    Réponses: 5
    Dernier message: 26/10/2006, 12h04

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