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 :

taille des structures


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    F�vrier 2008
    Messages
    28
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2008
    Messages : 28
    Par d�faut taille des structures
    Voila mon probleme, je n'arrive pas a definir la taille de mes structures, ce qui est problematique pour certaines operations.

    Mon compilo est un mingw.

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    int main () {
    	struct struct1 {
    		unsigned short type;
    	};
    	struct struct2 {
    		unsigned long fileSize;
    	};
    	struct struct3 {
    		unsigned short type;
    		unsigned short fileSize;
    	};
    	struct struct4 {
    		unsigned short type;
    		unsigned long fileSize;
    	};
    	struct struct5 {
    		unsigned long type;
    		unsigned long fileSize;
    	};
    	struct struct6 {
    		unsigned char type;
    		unsigned char fileSize;
    	};
    	struct struct7 {
    		unsigned char type;
    		unsigned short fileSize;
    	};
    	struct struct8 {
    		unsigned char type;
    		unsigned long fileSize;
    	};
     
     
    	std::cout << sizeof(struct struct1) << '\n';
    	std::cout << sizeof(struct struct2) << '\n';
    	std::cout << sizeof(struct struct3) << '\n';
    	std::cout << sizeof(struct struct4) << '\n';
    	std::cout << sizeof(struct struct5) << '\n';
    	std::cout << sizeof(struct struct6) << '\n';
    	std::cout << sizeof(struct struct7) << '\n';
    	std::cout << sizeof(struct struct8) << '\n';
    	return 0;
    }
    le resultat :
    On dirait qu'il "aligne" la taille du plus petit type sur le plus grand.

    Je doit avouer etre un peut paum�, ce que je croyais etre absolu ne l'est plus

    Une explication ? Une solution ?


    edit: Voila ce que j'ai trouv� :
    Mauvais design. Une structure C n'est absolument pas faite pour mapper un
    flux de bytes (la preuve).

  2. #2
    Membre exp�riment� Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    D�tails du profil
    Informations personnelles :
    �ge : 45
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par d�faut
    Bonjours,
    Tes tailles sont normal, et s'explique par l'alignement m�moire de tes variable.

    Par exemple, avec ta structure struct4, ton long n�cessite un alignement de 4, et se trouve apr�s ton short, donc le compilo rajoute deux octets entre les deux pour que tout ce passe bien.

    Quel probl�me ce te pose exactement?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    F�vrier 2008
    Messages
    28
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2008
    Messages : 28
    Par d�faut
    Un classique probleme de lecture de fichiers.

    Par exemple, lire 50 octets et les mapper dans ma structure. Je croyais ca possible.

    J'ai trouv� quelques pistes mais pas encore de solution.


    Si je lis les 50 octets dans un unsigned char tab[50], comment prendre les octets 3,4,5,6 et les assigner a un unsigned long ?

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    unsigned long ul;
    ul = tab[3]
    C'est portable ca ? Une autre solution ?

  4. #4
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Citation Envoy� par nemodev Voir le message
    C'est portable ca ?
    Non. Tu auras des probl�mes d'alignement et d'endian.
    Citation Envoy� par nemodev Voir le message
    Une autre solution ?
    Boost.Serialize

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    F�vrier 2008
    Messages
    28
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2008
    Messages : 28
    Par d�faut
    Merci. Moi qui croyais pouvoir etre flemmard sur ce coup

    J'ai trouv� ca aussi:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    #pragma pack(push, 1)
    	struct struct8 {
    		unsigned char type;
    		unsigned long fileSize;
    	};
    #pragma pack(pop)

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    F�vrier 2008
    Messages
    28
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2008
    Messages : 28
    Par d�faut
    Depuis le temp, il va bien falloir me mettre a boost. Je dois avoir le gene de la flemme

    Marche sur mingw, pas test� avec les floatants.

    Merci pour tout, et � la prochaine pour de nouvelles aventures

  7. #7
    Membre exp�riment� Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    D�tails du profil
    Informations personnelles :
    �ge : 45
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par d�faut
    Marche sur mingw, pas test� avec les floatants.
    Mais ta solution n'est toujours pas portable...

    Merci. Moi qui croyais pouvoir etre flemmard sur ce coup
    Passer par un bon vieux ifstream/ofstream est certainement la solution la plus simple que je connaisse.

  8. #8
    Membre exp�riment� Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    D�tails du profil
    Informations personnelles :
    �ge : 45
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par d�faut
    A non ca ne marche pas et en plus ca ne serai pas portable.

    Les principales solutions me venant a l'esprit c'est:
    - Passer par les flux et un fichier text.
    La lecture et l'�criture sont simple, sure, et portable, exemple:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    fstream archive("archive.txt");
    archive << Struct3.type << " " << Struct3.fileSize;
    archive >> Struct3.type >> " " >> Struct3.fileSize;
    - Passer par un fichier xml(Par exemple avec TinyXml, pour faire simple). Le principale avantage par rapport au flux, c'est que ton fichier XML peut avoir une structure tr�s complexe, avec une arborescence, et des attribut nomm�.

    - Utiliser boost::serialization. Personnellement j'adore cette librairie. On peut au choix enregistrer en xml, en text ou en binaire sans rien change dans les class s�rialis�es. Elle gere l'�volution des class, les class polymorphique, et des tas d'autre chose bien pratique.


    Ce sont trois m�thodes que j'utilise couramment, et je dirais que le choix d�pend du contexte.

    EDIT: le #pragma pack(push, 1) ne marche que sous visual il me semble, de plus ca ne g�re pas l'endian, ni les diff�rence d'encodage des nombre a virgule flottantes.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. taille de structure bizarre ...
    Par lyrau dans le forum C
    R�ponses: 3
    Dernier message: 20/11/2003, 10h46
  2. taille des integer sous Interbase 6.0
    Par kinda dans le forum InterBase
    R�ponses: 4
    Dernier message: 04/04/2003, 11h34
  3. Taille des tabulations dans un TMemo ?
    Par dergen dans le forum Composants VCL
    R�ponses: 2
    Dernier message: 07/01/2003, 19h38
  4. Taille des surfaces avec DirectDraw
    Par Shakram dans le forum DirectX
    R�ponses: 5
    Dernier message: 09/09/2002, 00h42
  5. Taille des champs proportionnelle...
    Par Depteam1 dans le forum Composants VCL
    R�ponses: 2
    Dernier message: 09/08/2002, 11h48

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