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++

  1. #1
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    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 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    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
    Expert confirmé
    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
    Points : 4 442
    Points
    4 442
    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 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    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 éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    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 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    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 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    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.

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Mué, le sujet que tu montres de SO date de 2009, donc pour la fonctionnalité de C++14 j'ai des doutes.
    J'avoue je n'ai pas fait attention au date. Je suis parfois perdu entre les normes. Surtout que visual s'est souvent permis quelque liberté par rapport à la norme. Ce qui normalement n'est plus le cas aujorud'hui.

    Citation Envoyé par Bousk Voir le message
    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.
    En C le 0 est obligatoire il me semble. Mais l'idée c'est bien cela. Et c'est justement le cas de la struct B qui m'as posé problème. Je pensais que cela devait initialiser toutes la structure à 0. D'où le poste de départ.

  9. #9
    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

  10. #10
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    EDIT: à la réflexion, je suis en retard d'un standard, sorry

    Je crois que tu confonds deux choses:

    - depuis C++11, un type de base comme int, char, etc. est initialisé à 0 quand il est initialisé par une paire d'accolades vide (http://en.cppreference.com/w/cpp/lan...initialization)
    - si un type utilisateur est initialisé avec une accolade vide, ce sont les règles de l'initialisation par défaut (http://en.cppreference.com/w/cpp/lan...initialization). Dans ce cas-là, selon la nature du type initialisé, un constructeur est appelé ou bien, s'il s'agit d'un type POD, comme par exemple une structure composée uniquement de types de base et sans constructeur d'aucune sorte, ses membres sont initialisés à une valeur indéterminée: je pense que c'est le cas pour ta structure.

  11. #11
    Expert confirmé
    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
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par stendhal666 Voir le message
    - depuis C++11, un type de base comme int, char, etc. est initialisé à 0 quand il est initialisé par une paire d'accolades vide (http://en.cppreference.com/w/cpp/lan...initialization)
    C'est bien ce cas là: type de base ou ctor par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct T1
    {
        int mem1;
        std::string mem2;
    }; // implicit default constructor
     
    int main()
    {
        T1 t1 {};               // class with implicit default constructor
                                //     t1.mem1 is zero-initialized
                                //     t1.mem2 is default-initialized
    }
    Du coup VS2013 ne respecte pas cette règle en cas d'héritage, mais VS 2015 la respecte.

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par stendhal666 Voir le message
    Dans ce cas-là, selon la nature du type initialisé, un constructeur est appelé ou bien, s'il s'agit d'un type POD, comme par exemple une structure composée uniquement de types de base et sans constructeur d'aucune sorte, ses membres sont initialisés à une valeur indéterminée: je pense que c'est le cas pour ta structure.
    *Pour une struct POD, le compilateur as un constructeur par defaut qui met tout à 0 (depuis standard ??
    * pour une stuct non POD, le constructeur par défaut ne fait rien.

    Et c'est surement ce qui se passe pour ma struct B. Elle n'est pas POD à cause de l'héritage et donc le constructeur par défaut ne fait rien.

    Je met en résolu car je pense que j'ai ma réponse.
    Merci à tous.

  13. #13
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    Du coup VS2013 ne respecte pas cette règle en cas d'héritage, mais VS 2015 la respecte.
    Il n'y as pas de problème sur la struct que tu montre. J'ai seulement un problème dans la struct B qui as un comportement différent à cause de l'héritage.

  14. #14
    Expert confirmé
    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
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par yan Voir le message
    Il n'y as pas de problème sur la struct que tu montre. J'ai seulement un problème dans la struct B qui as un comportement différent à cause de l'héritage.
    Citation Envoyé par yan Voir le message
    Elle n'est pas POD à cause de l'héritage et donc le constructeur par défaut ne fait rien.
    Justement, nulle part ils ne parlent de POD

    Since C++11, value-initializing a class without a user-provided constructor, which has a member of a class type with a user-provided constructor zeroes out the member before calling its constructor:
    .Je pense que c'est simplement un problème avec VS 2013 qui ne respecte pas la norme en cas d'héritage.

  15. #15
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    Je pense que c'est simplement un problème avec VS 2013 qui ne respecte pas la norme en cas d'héritage.
    Ok merci

  16. #16
    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 yan Voir le message
    *Pour une struct POD, le compilateur as un constructeur par defaut qui met tout à 0 (depuis standard ??
    Je suis pas sur de comprendre la phrase, mais dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct test_t
    {
        int i;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test_t t; // t.i n'est pas forcément égal à 0
    Contrairement à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct test_t
    {
        int i;
     
        test_t() : i() { }
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test_t t; // t.i est forcément égal à 0

  17. #17
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Ehonn Voir le message
    Je suis pas sur de comprendre la phrase, mais dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct test_t
    {
        int i;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test_t t; // t.i n'est pas forcément égal à 0
    par ce que dans ce cas il n'y as pas d'appel au constructeur implicite qui met à zero la structure :/.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    test_t t; // t.i n'est pas forcément égal à 0
    t = test_t();// on copie dans t une structure initialiser avec le constructeur implicite.
     
     
    class foo
    {
        test_t t;
    public :
        foo()
        : t() //appel du constructeur implicite généré par le compilateur et qui met tout à zéro
    {
     
    }
    Les types POD (peut être les types non POD aussi?), sans constructeur de définie, ont un constructeur implicite qui l'initialise à zéro mais qu'il faut appeler explicitement. Sinon c'est le constructeur définie qui est appelé.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct test_t
    {
        int t;
       test_t()//constructeur
       :t()//appel le constructeur implicite qui met à zéro t
       {}
     
    };
     
    test_t t; //appel le constructeur définie => i = 0

  18. #18
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    Je pense que c'est simplement un problème avec VS 2013 qui ne respecte pas la norme en cas d'héritage.
    J'ai trouve ceci : http://en.cppreference.com/w/cpp/lan...initialization
    Ca semble dire plutôt dire que ce qui se passe sous visual 2013 est normale....

+ 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