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 :

un problème de padding ?


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 64
    Par défaut un problème de padding ?
    Bonjour,

    Je tente de lire le header d'un fichier bitmap. J'y arrive en utilisant fread pour chacun des champs de ma structure BMPHeader 1 par 1, mais lorsque je veux lire l'ensemble de mon header en faisant un fread global, je n'obtiens que des valeurs incorrectes.

    Comme la struct de mon header contient des "short int", j'intuite que mes données sont mal remplies à cause d'un probleme d'arrondi en int des tailles de structs ?

    J'ai entendu rapidement parler de padding, d'alignement, est ce qu'il s'agit du problème auquel je suis confronté ? Quelqu'un pourrait il me pointer une documentation (plus) claire (que wikipédia), idéalement avec un schéma, si c'est ce problème afin que je comprenne bien de quoi il s'agit ?

    Voici mon source :

    Mon header de BMP :

    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
    typedef struct {
    unsigned short int magicid;                 
    unsigned int fileSize;                      
    unsigned short int reserved1, reserved2;
    unsigned int offset;                     
    unsigned int headerSize;             
    int width;
    int height;               
    unsigned short int planes;       
    unsigned short int bits;         
    unsigned int compression;     
    unsigned int imagesize;         
    int xresolution,yresolution;     
    unsigned int ncolours;
    unsigned int importantcolours;  
    } BMPHeader;
    Remplit des valeurs correctes, mais est pénible et pas propre au niveau du code car oblige à faire 20 freads d'affilée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (fread(&header.magicid,sizeof(short int),1,fptr) != 1) {
    		fprintf(stderr,"Failed to read BMP magic header\n");
    		exit(-1);
    	}
    	fprintf(stderr,"ID is: %d, should be %d\n",header.magicid,'M'*256+'B');
    	fread(&header.fileSize,sizeof(int),1,fptr);
    	fprintf(stderr,"File size is %d bytes\n",header.fileSize);
    Remplit des valeurs incorrecte dans ma struct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    long readsize = fread(&header,sizeof(BMPHeader),1,fptr);
    	fprintf(stderr,"Read size : %d", readsize);
    if ( tailelue != 1) {
    	fprintf(stderr,"Failed to read BMP info header\n");
    	exit(-1);
    }

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2006
    Messages : 107
    Par défaut
    Tu as un problème de padding car ta structure mélange de shorts et des int : le compilateur insère donc des octets de bourrage afin que les adresses d'accès aux champs soient multiples de 4 octets.
    tu peux entourer ta structure de
    et
    pour indiquer au compilateur de ne pas optimiser le temps d'accès aux données de la structure.

    tu peux consulter un sujet récent : http://www.developpez.net/forums/d86...le-structures/

  3. #3
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Si tu utilises GCC tu peux aussi utiliser le flag -fpack-struct[=n]
    Plus d'infos : http://gcc.gnu.org/onlinedocs/gcc/Co...de-Gen-Options

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Attention, il me semble que d'après Microsoft, les structures BITMAPFILEHEADER et BITMAPINFOHEADER sont en pack(2), pas en pack(1) (même si techniquement ça ne change rien dans le cas présent).
    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
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Sachant que si tu es sous Windows, il est préférable d'inclure Wingdi.h afin d'avoir directement les définitions correctes de ces structures...

    Côté portabilité, si tu as un souci avec les #pragma pack ou équivalent, il te faudra passer par les champs de bits (un peu lourd) ou un tableau d'entiers 16 bits avec des setters/getters (lourd aussi).
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. Problème capture pad
    Par adriiiaen dans le forum Autres Logiciels
    Réponses: 0
    Dernier message: 17/08/2009, 10h44
  2. Problème de padding avec jasperReport 2.0.4 et 2.0.3
    Par ramoucho17 dans le forum iReport
    Réponses: 0
    Dernier message: 12/02/2008, 17h22
  3. Problème de padding sous IE (OK sous Mozilla, opera et autre
    Par bblampain dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 24/12/2007, 11h34
  4. problème de padding sous firefox
    Par stars333 dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 10/11/2007, 02h04
  5. Problème de padding avec text-align:right sous IE
    Par Oluha dans le forum Mise en page CSS
    Réponses: 11
    Dernier message: 07/02/2007, 14h18

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