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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 26
    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 chevronné 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
    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 confirmé
    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
    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 émérite 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
    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 averti
    Inscrit en
    Juin 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 26
    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 averti
    Inscrit en
    Juin 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 26
    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

+ 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