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 d'écriture d'une structure dans un fichier


Sujet :

C++

  1. #1
    Membre à l'essai

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 28
    Points : 22
    Points
    22
    Par défaut Problème d'écriture d'une structure dans un fichier
    Bonjour, je suis en train de programmer une petite application qui manipule des bmp (format très simple), mais je rencontre un problème lors de l'écriture d'une bitmap.
    J'ai crée une structure représentant le header d'une bitmap:
    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
    typedef struct TagHBMP{
                             WORD  Sign;
    			 DWORD Csize;
    			 DWORD Resv;
    			 DWORD Offset;
    			 DWORD HeadSize;
    			 DWORD Width;
    			 DWORD Heigth;
    			 WORD  Plan;
    			 WORD  Depth;
    			 DWORD Comp;
    			 DWORD ImSize;
    			 DWORD HRez;
    			 DWORD VRez;
    			 DWORD Palette;
    			 DWORD ImPalette;
     
    }HBMP;
    Les pixels sont quant à eux dans la classe bitmap qui reprend cette structure et ils sont enregistrés sans aucun problème.
    Le problème est le suivant: lorsque j'enregistre en bloc cette structure (qui fait 54octets) le programme en copie 56 en injectant 1 octet après les 2 premiers. La fonction utilisée est un simple fwrite mais le problème ne vient pas de là vu que quand je demande la taille de ma structure il me retourne qu'elle fait 56 octets...Et ça cela reste un mystère, je n'ai jamais lus où appris que lors de la création d'une structure sa taille dépassait la somme de ses composantes.
    Toute aide est donc la bienvenue.

    ps: au cas où certains de connaissent pas les WORD et DWORD, WORD = 2 octets, DWORD = 4 octets.

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    C est peut etre lie au padding, l alignement realise par le compilo
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  3. #3
    Membre à l'essai

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    Erf, je connaissait pas ce terme. Et est il possible que le problème disparaisse si je crée ce header de façon dynamique, pour que la structure soit mise en mémoire sans emplacement prédéfinis? Je crois que je vais tester ça.
    Merci de la réponse

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    il existe des directives pre-processeur pour faire ce que tu veux
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  5. #5
    Membre à l'essai

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    Bon ba faire en dynamique ne change rien au problème (à part que les valeurs des octets injectés changent...).
    Sinon je suis prenneur pour tes directives =).Si tu pouvais m'expliquer qu'est ce que c'est s'il te plait.(car sinon je sent que je vais faire cette structure en faisant un champ de bit moi...)

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    fais une recherche surr le forum ca a deja ete cree me souviens plus exactement des directives

    push pack ( 1) ?
    push pop ?
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  7. #7
    Membre à l'essai

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    oki je vais faire ça. Merci

  8. #8
    Membre à l'essai

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    C'est bon mon problème est résolu, il suffisait donc de faire un #pragma pack(pop,2) afin que la taille de la structure soit un mutliple de 2 et non de 8 par défaut. Merci grace à toi j'ai enfin compris comment pouvoir manager soit même la taille de ses structure (je m'apperçois que faire un champ de bit n'aurai servis à rien).

    ++

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Cette solution est complètement dépendante du compilateur, et en plus s'il y a unalignement par défaut, c'est qu'il y a une raison : la vitesse d'accès.
    Tu ferais bien mieux de mettre des WORD à la in de la strusture afin de ne pas décaler tous les DWORD.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 572
    Points
    41 572
    Par défaut
    Pourquoi ne pas utiliser directement les structures BITMAPFILEHEADER et BITMAPINFOHEADER ?
    Elles sont déjà déclarées avec les options de padding nécessaires pour que ça marche... (sous Visual, et il me semble que sous MinGW aussi).
    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.

  11. #11
    Membre à l'essai

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    Je n'ais pas utilisé de strucuture prédéfini car je voulais réfléchir un peu et faire la structure.
    Si je rajoute des word à la fin de ma structure, sa taille va être modifié non?, Je voulais faire en sorte que j'ai juste à écrire le header d'un coup pour que ça marche.
    (je viens de rajouter un word à la fin de la structure pour la recaler, mais il me rajoute de nouveau un word après le premier...)

    La modification d'allignement n'agis que sur la première structure qu'il rencontre, donc la seule vitesse d'accés modifié est au niveau de cette structure non?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 572
    Points
    41 572
    Par défaut
    La modification d'alignement pour Visual agit jusqu'à annulation. Comme on peut empiler les alignement, généralement on pushe, on spécifie, on définit les structures et on poppe.

    Pour gcc, c'est un __attribute__(()) à mettre sur la structure elle-même.
    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.

  13. #13
    Membre à l'essai

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    Oki donc il faut que j'encadre ma structure avec pack(push,2) et pack(pop) pour que la modification d'allignement n'agisse que sur cette structure.
    Merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 572
    Points
    41 572
    Par défaut
    La façon préconisée par MS, c'est d'inclure deux headers qui font le travail:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include <pshpack2.h>
     
    struct { ... };
     
    #include <poppack.h>
    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.

  15. #15
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par Grifos
    Si je rajoute des word à la fin de ma structure, sa taille va être modifié non?, Je voulais faire en sorte que j'ai juste à écrire le header d'un coup pour que ça marche.
    (je viens de rajouter un word à la fin de la structure pour la recaler, mais il me rajoute de nouveau un word après le premier...)
    Je parle de mettre tes variables à la fin, pas d'en rajouter pour faire joli...

    Citation Envoyé par Grifos
    La modification d'allignement n'agis que sur la première structure qu'il rencontre, donc la seule vitesse d'accés modifié est au niveau de cette structure non?
    Outre la programmation, il faut parfois aussi s'intéresser à l'architecture des processeurs.

  16. #16
    Membre à l'essai

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    Je parle de mettre tes variables à la fin, pas d'en rajouter pour faire joli...
    Oups j'avais mal compris, je croyais que tu me disait de rajouter un WORD, le truc c'est que si je met les word à la fin, quand j'écrirais le header les informations seraient dans le désordre.

    Outre la programmation, il faut parfois aussi s'intéresser à l'architecture des processeurs.
    Plutôt que de critiquer mon ignorance sur l'architecture d'un processeur, je préfère qu'on ne me réponde pas où qu'on me le dise plus gentiment, ça aurait été plus correct formulé de cette façon : "Non tu as tort, va te renseigner sur l'architecture des processeurs pour comprendre"
    Et si tu parlais veut dire qu'il faut que je m'interresse aux registres je t'avouerais que je n'y ais pas du tout pensé.
    Si il n'y avait aucun caractère désobligeant dans ta remarque, je te prie de ne pas prendre compte de la mienne.

    Sinon merci de vos réponse

  17. #17
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par Grifos
    Oups j'avais mal compris, je croyais que tu me disait de rajouter un WORD, le truc c'est que si je met les word à la fin, quand j'écrirais le header les informations seraient dans le désordre.
    Ah oui, tu es obligé de conserver l'ordre

    Citation Envoyé par Grifos
    Plutôt que de critiquer mon ignorance sur l'architecture d'un processeur, je préfère qu'on ne me réponde pas où qu'on me le dise plus gentiment, ça aurait été plus correct formulé de cette façon : "Non tu as tort, va te renseigner sur l'architecture des processeurs pour comprendre"
    Et si tu parlais veut dire qu'il faut que je m'interresse aux registres je t'avouerais que je n'y ais pas du tout pensé.
    Je ne parle pas de registre, je parle d'alignement.

  18. #18
    Membre à l'essai

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    Je ne parle pas de registre, je parle d'alignement.
    Alors là je n'ai vraiment aucune idée.Il Faudra que je fasse des recherche sur ça.

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

Discussions similaires

  1. envoyer une structure dans un fichier et le comparer.
    Par gindrou dans le forum Débuter
    Réponses: 3
    Dernier message: 09/12/2008, 18h13
  2. Réponses: 8
    Dernier message: 02/12/2007, 02h03
  3. Réponses: 9
    Dernier message: 04/06/2007, 21h44
  4. stocker une structure dans un fichier ini?
    Par Mickey.jet dans le forum C
    Réponses: 6
    Dernier message: 13/09/2006, 16h57
  5. copier une structure dans un fichier
    Par brute dans le forum MFC
    Réponses: 18
    Dernier message: 10/03/2006, 14h30

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