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 :

Signification d'un warning


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Signification d'un warning
    Salut à tous.

    Au cours du développement d'un projet, je suis tombé sur un warning que je n'arrive pas à expliquer :
    warning: ignoring packed attribute because of unpacked non-POD field 'NOM PARTICULIER D'UN ATTRIBUT' [enabled by default]

    Je veux bien vous donner du code mais ce warning ce reproduit régulièrement et a des endroits qui me semblent normaux. Google est assez avare d'explication sur ce warning =/

    Pour info : je code avec avr-g++ (4.7.2) à destination d'une carte Arduino mega 2560 avec le C++11 d'activé. A noter que tout marche bien pour le moment =)

    Si quelqu'un peut éclairer ma lanterne !

    David
    "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)

  2. #2
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Salut,

    d'après ce que je comprends et trouve sur Google, tu dois essayer de packer une structure qui contient un type complexe (donc pas un POD). Et c'est impossible.
    Typiquement un vector, list, [] etc ne seront absolument pas "packables".
    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
    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
    Certes, mais ca veut dire quoi packable ?
    C'est une histoire d'alignement des champs mémoires/padding ?

    Edit : Je viens de rechercher sur google et il semble effectivement que ca soit lié au padding des données.

    Mais au final je ne vois pas quoi faire avec ce warning. Il m'indique juste que j'ai des attributs non-packed dans une structure packed. Qu'est ce que ca change pour moi ?
    "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)

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Ça change que la structure n'est pas vraiment packed. Et donc, si tu tentes de l'écrire directement dans un fichier binaire, tu peux avoir (en plus des problèmes d'endianness) des octets de bourrage insérés à des endroits où tu ne t'y attends pas.

    La bonne réponse pour écrire ça dans un fichier binaire est de sérialiser manuellement ta structure au lieu de faire un gros write() de la structure entière.
    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.

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,
    Citation Envoyé par Davidbrcz Voir le message
    Certes, mais ca veut dire quoi packable ?
    C'est une histoire d'alignement des champs mémoires/padding ?
    En tout cas, cela a trait à ce qui est autorisé pour les types POD.

    C++11 apporte des précisions quant à ce qui est nécessaire pour obtenir un objet de type POD qui sont très clairement de nature à permettre d'obtenir un avertissement si l'une ou l'autre des structures n'est pas de type POD

    Pour info, C++11 définit maintenant deux "concepts" qui doivent tous deux être respectés pour les types POD:
    • Le concept de "type trivial"
    • Le concept de "standard layout"
    Un type est considéré comme trivial si
    • il ne propose pas de constructeur par défaut non trivial
    • il ne propose pas de constructeur par copie non trivial
    • il ne propose pas de constructeur par déplacement non trivial
    • il ne propose pas d'opérateur d'affectation non trivial
    • il ne propose pas d'opérateur d'affectation par déplacement non trivial
    • il ne propose pas de destructeur non trivial.
    • ses éventuelles classes de base ne proposent que des fonctions triviales
    • ses différents membres sont eux même triviaux
    Pour que toutes ces fonctions puissent être considérées comme triviales, il faut
    • Soit qu'elles ne soient purement et simplement pas déclarées (de manière à laisser le compilateur les implémenter de manière automatique)
    • Soit qu'elles soient déclarée comme étant "default"


    Ainsi, une structure proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct MyStruct
    {
        // aucune des fonctions "de base" sus-citée n'est déclarée
        int i;
        double d;
        long l;
        char str[10];
        int tab *;
    };
    sera considérée comme triviale, de même que la structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct Derived  : public MyStruct // MyStruct est triviale comme je l'ai dit plus haut
    {
        Derivied() = default;
        float ftab[10];
    };
    Par contre, une structure proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct NonTrivial
    {
        int i;
        std::string str; // std::string est non triviale, du fait de ses nombreux
                         // constructeurs non triviaux et de son destructeur
    };
    ou proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct NonTrivialCauseVirtualDtor
    {
        virtual ~NonTrivialCauseVirtualDtor(); // non trivial pour cause de virtualité
        int i;
    };
    ne sera pas considérée comme triviale.

    Le "concept" de "standard layout" va, quant à lui, essentiellement s'intéresser à la manière dont les données sont représentées en mémoire dans la structure.

    Un type est considéré comme "standard layout" si:
    1. il n'a aucun membre non statique qui ne soit pas "standard layout "
    2. il n'a ni fonction virtuelle ni héritage virtuel
    3. Tous ses membres non statiques sont soumis au même contrôle d'accès
    4. il ne dérive pas d'une classe n'étant pas "standard layout"
    5. either has no base class with non-static data members or has no non-static data members in the most derived class and only one base with them (pas certain de la traduction à donner de cette phrase )
    6. n'a pas de classe de base du même type que son premier membre non statique
    Bref, comme tu peux le constater, il y a maintenant pas mal de restrictions apportées à ce que l'on peut considérer comme étant un type POD

    Il y a tout lieu de croire que tu te trouves régulièrement dans une situation dans laquelle le compilateur estime que tu veux travailler avec des types POD alors que les conditions ne seraient pas toutes remplies pour qu'il puisse effectivement considérer les types envisagés comme tels
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Il y a tout lieu de croire que tu te trouves régulièrement dans une situation dans laquelle le compilateur estime que tu veux travailler avec des types POD alors que les conditions ne seraient pas toutes remplies pour qu'il puisse effectivement considérer les types envisagés comme tels
    La présence de l'attribut "packed" est un bon indice du désir de travailler en POD.
    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.

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    La présence de l'attribut "packed" est un bon indice du désir de travailler en POD.
    En effet
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/02/2010, 20h03
  2. Signification Warning /040
    Par BOLARD dans le forum Dev-C++
    Réponses: 3
    Dernier message: 12/03/2007, 22h00
  3. [warning][properties]problème de police introuvable
    Par cyrdec dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 11/04/2003, 17h41
  4. Warnings lors de la compilation
    Par polo54 dans le forum C
    Réponses: 5
    Dernier message: 07/02/2003, 09h12
  5. i386, x86 signification ?
    Par Thcan dans le forum Assembleur
    Réponses: 7
    Dernier message: 04/01/2003, 21h36

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