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

Langage C++ Discussion :

Mise a zéro d'une structure par des accolades vides


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut Mise a zéro d'une structure par des accolades vides
    Bonjour,

    Si j'ai bien compris, on peux maintenant initialiser tous les membres d'une structure à 0 en utilisant des accolades vide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Foo bar;
    bar = {};
    Seulement ce n'est pas ce qui se passe dans ce code sous visual 2013

    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
     
    struct A
    {
        unsigned char val;
    };
     
     
    struct B : public A
    {
    };
     
    struct C
    {
        A a;
    };
     
     
    int main (int argc, char* argv[])
    {
        B b;
        C c;
     
        b.val = 1;
        b = {};//val = 204 <= pourquoi???
     
        c.a.val = 1;
        c = {};//a.val = 0 <= OK
     
        return 0;
    }
    Sur la struct B, cela initialise toute la mémoire par des valeurs 8bits de valeurs 204.

    Je ne comprend pas pourquoi, la structure B ne se met pas à zéro.

    Si quelqu'un as une idée.

    merci
    Yan

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Tu as compris et vu ça où ?
    La seule syntaxe que je connais c'est char c[12] = {0}; qui est équivalent à faire un memset à 0 sur la structure à sa création, mais ça ne marche qu'à la déclaration il me semble.
    Et qu'on peut appeler le constructeur avec des {} depuis C++14 (je crois).
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par yan Voir le message
    Seulement ce n'est pas ce qui se passe dans ce code sous visual 2013
    Marrant, ça met bien le contenu à 0 sous VS2015 (mais j'avoue que la syntaxe m'étonne).

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    En principe c'est un ajout de C++14 mais je n'ai pas trouvé de super info dessus. Juste dans quelques réponses de stackowerflow

    Dans mon cas, ce que j'ai compris
    * struct A et C sont des POD et tous les membres sont mise à zéro (constructeur par défaut d'une struct POD).
    * struct B n'est pas un POD à cause de l'héritage =>l'init pas défaut ne met pas les membre à 0. Si j'ajoute un constructeur par défaut, la struct prend les valeurs fournie par ce constructeur.

    Pour le 204, c'est en faite 0xCC en hexa qui est un magic number de visual studio :
    CCCCCCCC : Used by Microsoft's C++ debugging runtime library and many DOS environments to mark uninitialized stack memory. CC resembles the opcode of the INT 3 debug breakpoint interrupt on x86 processors.

    Ce qui m'étonne est que l'héritage rend la struct B non POD.

    yan

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 515
    Par défaut
    VS2013 n'est pas full compliant C++14, VS2015 non plus je crois, mais plus que VS2013.
    Le mode DEBUG peut peut-être jouer aussi.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par bacelar Voir le message
    VS2013 n'est pas full compliant C++14, VS2015 non plus je crois, mais plus que VS2013.
    Le mode DEBUG peut peut-être jouer aussi.
    La valeur 0xCC est bien seulement en debug.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Mué, le sujet que tu montres de SO date de 2009, donc pour la fonctionnalité de C++14 j'ai des doutes.
    Ca ressemble juste à l'initialisation des struct en C via ={0}; raccourci. J'ai pour habitude de mettre le 0 mais il est sûrement superflu.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 11/01/2007, 09h35
  2. Réponses: 1
    Dernier message: 13/09/2006, 15h12
  3. TRI d'une structure à partir des noms
    Par jeff69 dans le forum C
    Réponses: 12
    Dernier message: 26/08/2006, 20h20
  4. [VBA-E] Séparer les colonnes d'une listbox par des lignes?
    Par mulot03 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/05/2006, 14h03
  5. Modifier une requête par des données différente
    Par leloup84 dans le forum Requêtes
    Réponses: 9
    Dernier message: 06/03/2006, 14h23

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