j'ai un problème de la taille d'une structure ??!!
voila l'exmple:
#include <stdio.h>
#include <stdlib.h>
typedef struct Header{
char b; //1 octet
char m; // + 1Octet => 2 Octet
long x; // 4 6
long y; //4 10
long z;// 4 14
long e;// 4 18
long f;// 4 22
long g; // 4 26 Octets
}Header;
int main(){
int l;
FILE* er=fopen("d:\image.bmp","rb");
Header *h =(Header*)malloc(sizeof(Header));
printf("taille de la structure=%d \n",sizeof(Header)); // la fonction sizeof return 28 au lieu de 26 ??!!!!!!!
fseek(er,0,0);
fread(h,sizeof(Header),1,er);
fseek(er,18,0);
fread(&l,4,1,er);
fclose(er);
return 0;
}
- Edité par AhmedMhamdi8 15 janvier 2020 à 20:40:47
2) oui, c'est normal d'avoir 28 plutôt que 26: le compilateur aligne x sur un multiple de 4 octets, et tu perds 2 octets entre m et x. Tu as donc un "trou" à cet endroit-là. Un début d'explication ici
- Edité par edgarjacobs 15 janvier 2020 à 18:15:10
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Merci de colorer votre code à l'aide du bouton Code
Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: cpp;">Votre code ici</pre>.
Manque de Politesse
Votre message ne comporte pas ou peu de formules de politesse (« Bonjour », « Merci », « Au revoir », etc.). Les règles du site exigent que chaque nouveau message comporte un minimum de politesse. Après tout, les gens qui répondent le font gratuitement, sur leur temps libre. Ils méritent bien un minimum de considération, n'est-ce pas ?
Merci beaucoup pour la réponse. J'ai bien compris le problème. Alors comment je peut faire pour lire ma structure, qui modélise l'entête d'un fichier bitmap (image bmp), en un seul coup à partir du fichier:
Merci beaucoup pour la réponse. J'ai bien compris le problème. Alors comment je peut faire pour lire ma structure, qui modélise l'entête d'un fichier bitmap (image bmp), en un seul coup à partir du fichier:
fread(h,sizeof(Header),1,er);
Il faut forcer l'alignement de la structure avec le mot clé alignas en C11 et utiliser des entiers fixes comme uint8_t, int16_t, etc. Note : ces derniers ne sont pas forcément disponibles car ils sont facultatifs dans la norme.
Globalement, le plus simple est de lire chaque partie une à une.
Oublie pas non plus qu'il y a l'endian à gérer donc tu devras retourner les bits si nécessaire.
- Edité par markand 16 janvier 2020 à 9:46:10
git is great because Linus did it, mercurial is better because he didn't.
Il y a aussi la possibilité de se faire un petit jeu de fonctions de lecture/écriture pour 8/16/32/64 en BE/LE. Mais il reste nécessaire de lire/écrire une structure membre par membre. Pour du 32 bits non signé en LE par exemple :
C'est plus chiant que de faire un fread / fwrite sur la structure, mais ça évite les problèmes de padding (qui en plus mettent des données poubelles dans le fichier lors de l'écriture), les problèmes d'endianess et de taille des données. Tu imposes ainsi exactement ce qui doit être lu, comment et l'interprétation qui doit en être faite, plus aucune chance n'est laissée au hasard.
Si tu es intéressé, voici un lien vers le sujet qui a fait mon instruction en la matière, tu y trouveras des informations plus poussées sur le pourquoi et le comment.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
git is great because Linus did it, mercurial is better because he didn't.
Bonhomme !! | Jeu de plateforme : Prototype.