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 :

Problème de taille avec les structures


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 26
    Points : 16
    Points
    16
    Par défaut Problème de taille avec les structures
    Bonjour, j'ai un petit problème bien ennuyeux avec les structure. La taille de ma structure n'est pas celle que j'attends.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    struct myStruct{
        char c1; //1octet
        char c2; //1 octet
        char c3; //1 octet
        short s; //2 octet
    };
     
    int main{
        return printf("size myStruct =%d\n", sizeof(struct myStruct)); 
    }
     
    //affiche 6
    Je comprends le problème, le compilateur convertit la struct en une sorte de tableau ayant comme type de base, l'attribut le plus grand de la struct. Maintenant j'aimerai avoir une solution pour avoir 5 comme taille.

    Si cela est impossible j'aimerai avoir une solution de parcours de ma struct afin que je puisse recuperer tout les attributs, les 1 apres les autres.

    Merci

  2. #2
    Membre averti Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Points : 339
    Points
    339
    Par défaut
    Ton problème est un problème d'alignement. En effet, le champs "short s" est a une adresse impaire, c'est pour cela que le compilateur rajoute des octets de padding entre "char c3" et "short s" pour que l'adresse de s soit paire.

    tu peux essayer un truc comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #pragma pack(1)
    struct myStruct{
        char c1; //1octet
        char c2; //1 octet
        char c3; //1 octet
        short s; //2 octet
    };
    #pragma pack()
    pour voir si cela corrige ton problème.

    Une autre solution serait aussi de changer ta structure afin que s soit naturellement aligné. Mais là encore, le compilateur peut faire des choses de sa propre initiative.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct myStruct{
        short s; //2 octet
        char c1; //1octet
        char c2; //1 octet
        char c3; //1 octet
    };

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Je comprends le problème, le compilateur convertit la struct en une sorte de tableau ayant comme type de base, l'attribut le plus grand de la struct.
    Non, ce n'est pas une sorte de tableau. Comme l'a expliqué Jenna le compilateur se réserve le droit de séparer les différents champs en mémoire par des bytes supplémentaires pour améliorer l'accès aux données (mais doit respecter leur ordre de déclaration).

    Si cela est impossible j'aimerai avoir une solution de parcours de ma struct afin que je puisse recuperer tout les attributs, les 1 apres les autres.
    Une structure n'est pas un tableau et les éléments ne sont pas accessibles via un indice. La seule méthode sûre est d'accéder aux différents champs par leur nom.

  4. #4
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Si ton compilateur est gcc tu peux ajouter l'attribut «packed» comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct myStruct
    {
    	char c1; //1octet
    	char c2; //1 octet
    	char c3; //1 octet
    	short s; //2 octet
    } __attribute__ ((packed)) ;
    juste par curiosité c'est dans quel but ?

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 26
    Points : 16
    Points
    16
    Par défaut
    mon but est d'envoyer ces données à travers une trame ip. Du coup j'aimerai que les données envoyées sont les plus compacts possibles.
    Merci pour vos reponses, je vais tester ça maintenant

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 26
    Points : 16
    Points
    16
    Par défaut
    Bon je viens de tester, et apparement le __attribute__ ((packed)) fonctionne correctement. si je fait un sizeof dessus ça me retourne 5. par contre je suis curieux de savoir ce que fait en réalité le __attribute__ ((packed)).
    Merci

  7. #7
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Il indique tout simplement au compilateur qu'il ne faut pas aligner les champs de la structure.

  8. #8
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Sur la plupart des processeurs, l'accès à une donnée en mémoire et de taille égale à n octets se fait en un minimum de temps et d'instructions si cette donnée se trouve à une adresse multiple du minimum entre n et une valeur m qui définit ce qu'on appelle contrainte d'alignement. Cela est du à une contrainte technologique (et aussi économique), ce n'est pas une règle qu'on s'est inventé pour le plaisir. Afin d'optimiser la performance des programmes, les compilateurs placent automatiquement les données à des adresses qui respectent la contrainte d'alignement. Dans le cas d'une structure, tous les champs de la structure doivent respecter la contrainte d'alignement et la structure elle-même aussi doit la respecter. Certains processeurs refusent catégoriquement (pas les x86 en tout cas) d'accéder à une adresse qui ne respectent pas la contrainte d'alignement.

  9. #9
    Membre averti Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Points : 339
    Points
    339
    Par défaut
    Citation Envoyé par Melem Voir le message
    ...Certains processeurs refusent catégoriquement (pas les x86 en tout cas) d'accéder à une adresse qui ne respectent pas la contrainte d'alignement.
    Sur HP-UX (architecture PA-RISC), la sanction est immédiate ==> "Bus memory error"

  10. #10
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 26
    Points : 16
    Points
    16
    Par défaut
    Merci de vos réponse, je comprends mieux. Bon je vais me passer de cette instruction, d'autant plus que le code sera envoyer sur une cible de type omap.

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

Discussions similaires

  1. Probléme de compilation avec les structures
    Par bambitous dans le forum C
    Réponses: 3
    Dernier message: 17/12/2012, 09h40
  2. problème de syntaxe avec les structures .top et .left
    Par frisou65 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 01/09/2008, 15h10
  3. problème d'affichage avec les structures
    Par jlion5 dans le forum C
    Réponses: 1
    Dernier message: 03/05/2008, 13h13
  4. [Debutant], probléme avec les structures
    Par BobLunique dans le forum C
    Réponses: 5
    Dernier message: 27/03/2008, 19h19
  5. Problème avec les structures et gets!
    Par anis_el_madani dans le forum C
    Réponses: 11
    Dernier message: 23/07/2007, 00h57

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