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 :

Etat initial déclaration


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 113
    Par défaut Etat initial déclaration
    Bonjour,

    Je n'arrive pas à trouver de réponse à cette question toute simple :

    Je déclare une structure simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct maStruct{
    	uint32 size;
    	void *array;
    };
    Si je cré un tableau de maStruct :
    Comment sont les éléments de la structure à l'etat initial ? Est-ce que cela peut prendre n'importe quelle valeur ou est-ce que cela met d'office les "size" à 0 et les *array à NULL ?

    MErci :/

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Quand on met du code, c'est le bouton # (balises [code][/code] et pas [quote][/quote])

    Ceci dit, si tu crées un tableau de structures, comme tu l'as fais, elles ne sont pas initialisées, elles contiennent donc des valeurs aléatoires.

    Comme on est en C++, c'est le rôle des constructeurs que d'initialiser la structure.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 113
    Par défaut
    MErci beaucoup pour la réponse.
    Désolé pour les quote

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 113
    Par défaut
    Re...

    Est-ce que c'est different dans le cas d'un membre static de classe ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    struct DynamicArrayCache{
    	uint32 size;
    	void *array;
    };
     
    class DynamicArray{
    	public:
    	(...)
    	   static DynamicArrayCache cacheList[];
    };
     
    DynamicArrayCache DynamicArray::cacheList[5000];
    En parcourant les 5000 éléments j'ai systematiquement 0 pour size et array. Est-ce que je peux y faire confience pour la suite de mon prog ?

  5. #5
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Quand on met du code, c'est le bouton # (balises [code][/code] et pas )

    Ceci dit, si tu crées un tableau de structures, comme tu l'as fais, elles ne sont pas initialisées, elles contiennent donc des valeurs aléatoires.

    Comme on est en C++, c'est le rôle des constructeurs que d'initialiser la structure.
    Non.
    Ici, il n'y aucun constructeur explicite, donc le compilateur va en définir un et initialiser toutes les variables membres à des valeurs par défaut (0 en général).
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 113
    Par défaut
    Bonsoir,


    Ha ok, donc si je decrare un constructeur à ma structure (en gros une classe quoi) mais que j'initialise pas, alors les membres peuvent avoir n'importe quelle valeur ?

    Est-ce que l'initialisation automatique dans le cas d'une structure n'a pas tendence à consomer d'avantage de ressources que si s'etait une classe avec un constructeur déclaré mais qui n'initialise rien ?

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Non.
    Ici, il n'y aucun constructeur explicite, donc le compilateur va en définir un et initialiser toutes les variables membres à des valeurs par défaut (0 en général).
    Es tu sûr ? Je viens de créer un exemple et j'ai bien un tableau de valeurs non initialisées (qui semble aléatoire)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct maStruct{
    	int size;
    	char t_array;
    	unsigned char t_array2;
    };
    int _tmain(int argc, _TCHAR* argv[])
    {
    maStruct m_tbl[10];
    printf("%d %d %d\n", m_tbl[0].size, m_tbl[0].t_array, m_tbl[0].t_array2);
    	return 0;
    }
    Le résultat :
    -858993460 -52 204
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 113
    Par défaut
    Curieux ça...

    J'ai fais le test avec 5000 lignes dans mon exemple precedent avec un tableau static et tout est à 0....

  9. #9
    Membre éprouvé
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    189
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 189
    Par défaut
    ram-0000, est tu sûr d'avoir compiler en C++ ? Car je vois un beau printf et rien de ++ only.

  10. #10
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Ca dépend de l'implémentation. Donc a compilo différent résultats différents, a options différentes résultats différents. J'ai pas la norme sous la main pour vérifier mais il me semble que c'est ce qui a était dit récemment..

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 113
    Par défaut
    Je sais que je vais rester en C++, mais selon si c'est compilé pour du 64bit ou 32, linux ou win32, si j'ai un resultat different cela veut dire que je vais devoir initialiser moi même..

    Domage pour l'optimisation :s

  12. #12
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    ram-0000 >> comme l'a dit hiura, compile en C++ et pour tu auras un constructeur de généré par le compilateur.

    Citation Envoyé par Goten Voir le message
    Ca dépend de l'implémentation. Donc a compilo différent résultats différents, a options différentes résultats différents. J'ai pas la norme sous la main pour vérifier mais il me semble que c'est ce qui a était dit récemment..
    La flemme de fouiller la norme ce soir mais je suis sûr .
    Edit: le remord me tuait, donc j'ai ca en 12.1:7§
    An implicitly-declared default constructor for a class is implicitly defined when it is used to create an object of its class type (1.8). The implicitly-defined default constructor performs the set of initializations of the class that would be performed by a user-written default constructor for that class with an empty mem-initializer-list (12.6.2) and an empty function body.

    seal3 >> pas de raison d'avoir des résultats différents. Le compilateur génère dans tous les cas un constructeur s'il n'y en a pas. Après dès qu'il y en a un, le compilateur n'interfère plus dans ton code et considere que tu mets toutes les variables dans un état correct( comprendre que les variables non expliciements initialisé dans le constructeur sont dans un état aléatoire)
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  13. #13
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    8.5 - Initializers :

    4 To zero-initialize an object of type T means:
    — if T is a scalar type (3.9), the object is set to the value 0 (zero), taken as an integral constant expression, converted
    to T;94)
    — if T is a non-union class type, each non-static data member and each base-class subobject is zero-initialized;
    — if T is a union type, the object’s first named data member95) is zero-initialized;
    — if T is an array type, each element is zero-initialized;
    — if T is a reference type, no initialization is performed.
    5 To default-initialize an object of type T means:
    — if T is a non-POD class type (clause 9), the default constructor for T is called (and the initialization is ill-formed
    if T has no accessible default constructor);
    — if T is an array type, each element is default-initialized;
    — otherwise, the object is zero-initialized.
    Hum j'en déduis que tout doit être initiliasé à zéro. puisque : "and the initialization is ill-formed if T has no accessible default constructor" ne s'applique étant donné que le compilo en génére automatiquement un ?

    Petite précision ça vient d'un draft, de 2005 pas la norme .

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 113
    Par défaut
    Par contre je confirme que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	DynamicArrayCache cacheList[5000];
    	for(unsigned int i=0;i<5000;i++){
    		printf("%i %i %i\n",i,cacheList[i].size,cacheList[i].array);
    	}
    avec une structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct DynamicArrayCache{
    	uint32 size;
    	void *array;
    };

    Je compile bien en C++ puisque j'ai des classes avec constructeur qui se compilent bien.

    Miis j'ai bien vers la fin des valeurs non initialisées...


    Par contre ça ne me le fait pas si je declare mon tableau comme etant static depuis une classe :/

  15. #15
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par hiura Voir le message
    ram-0000, est tu sûr d'avoir compiler en C++ ? Car je vois un beau printf et rien de ++ only.
    J'ai repris l'exemple fourni au départ (je reconnais, le printf ne fait pas très c++) mais le source est un fichier cpp compilé sous Visual Studio 2005 (Windows XP SP3)

    Cet exemple me fait dire que pour une struct, le constructeur pas défaut (s'il y en a un qui est généré par le compilateur) ne fait rien sur les données membres
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  16. #16
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par seal3 Voir le message
    Curieux ça...

    J'ai fais le test avec 5000 lignes dans mon exemple precedent avec un tableau static et tout est à 0....
    Le cas du static est différent, ton tableau est placé dans un segment mémoire particulier qui lui est initialisé à 0 par le loader du programme. Ce n'est pas tout à fait pareil que pour des variables locales sur la pile
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 113
    Par défaut
    Ha oki

    Merci pour l'explication. Je vais rester la dessus.

  18. #18
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Mea culpa , mon monde s'écroule .

    Le compilateur générè bien un constructeur mais totalement vide (aucune liste d'initialisation et de corps vide (cf ma première citation)).

    De ce fait, aucune variable n'est initialisée.

    Encore mea culpa pour les betises que j'ai dites et la sureté avec laquelle je les ai dites.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  19. #19
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Mea culpa , mon monde s'écroule .

    Le compilateur générè bien un constructeur mais totalement vide (aucune liste d'initialisation et de corps vide (cf ma première citation)).

    De ce fait, aucune variable n'est initialisée.

    Encore mea culpa pour les betises que j'ai dites et la sureté avec laquelle je les ai dites.
    Oui mais non puisque :

    5 To default-initialize an object of type T means:
    — if T is a non-POD class type (clause 9), the default constructor for T is called (and the initialization is ill-formed
    if T has no accessible default constructor);
    — if T is an array type, each element is default-initialized;
    — otherwise, the object is zero-initialized.
    Donc les variables sont bien zero initialized dans le cas d'une structure sans constructeur et donc on applique ça :

    4 To zero-initialize an object of type T means:
    — if T is a scalar type (3.9), the object is set to the value 0 (zero), taken as an integral constant expression, converted
    to T;94)

    D'un autre côté, j'ai passé 3 heures à réviser du cisco, donc jsuis un peu éclaté et je peux mal interprété la norme.

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 113
    Par défaut
    Citation Envoyé par Goten Voir le message
    Donc les variables sont bien zero initialized dans le cas d'une structure sans constructeur et donc on applique ça :
    C'est dingue, pourtant un simple test sur une structure n'initialise pas à zéro visiblement :/

    Mea culpa , mon monde s'écroule .
    Encore mea culpa pour les betises que j'ai dites et la sureté avec laquelle je les ai dites.
    Pô grave, c'est quand même tres gentil à toi de m'avoir répondu

Discussions similaires

  1. [WD18] Etat initial d'un bouton dans un ruban
    Par jacquesprogram dans le forum WinDev
    Réponses: 2
    Dernier message: 12/09/2013, 17h24
  2. Etat initial mutex
    Par thierryG dans le forum Windows
    Réponses: 3
    Dernier message: 18/10/2007, 21h31
  3. Réponses: 4
    Dernier message: 12/03/2006, 20h47
  4. Réponses: 8
    Dernier message: 06/03/2006, 14h44
  5. Réponses: 8
    Dernier message: 17/05/2002, 09h08

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