Sizeof bizarre

Résolu
cs_khayyam Messages postés 51 Date d'inscription lundi 7 juin 2004 Statut Membre Dernière intervention 15 juillet 2005 - 3 août 2004 à 22:01
 3psilon - 7 août 2004 à 00:09
bonjour,

j'ai la structure suivante :
typedef struct
{
unsigned char sign1, sign2;
unsigned long size_totale, reserve,offset;

unsigned long size_entete, largeur, hauteur;
unsigned char nb_plans[2], deep_codage[2];
unsigned long method_comp, size_image, reso_ho, reso_ver, nb_coul_pal, nb_cou_imp;
} Header;

si vous comptez les champs ainsi que leur taille, vous trouverez un poids de 54 octets pourtant sizeof(Header) me sort 56 octets (sous windows). comment ça se fait ?

40 réponses

cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
3 août 2004 à 23:04
en faisant ca

CTOI(header[22])=hauteur;

tu ecris bien l'entier hauteur sur 4 octet à partir de l'offset 22, je vois pas ou est le probleme
3
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
3 août 2004 à 22:14
parce ce que à partir de unsigned char sign1, sign2; ta structure n'est plus alignée

l'adresse de size_totale commence à l'offset +4 et non +2 car son adresse doit etre un multiple de 4
0
cs_khayyam Messages postés 51 Date d'inscription lundi 7 juin 2004 Statut Membre Dernière intervention 15 juillet 2005
3 août 2004 à 22:21
encore une chose que je ne savais pas !

mais alors, comment dois-je m'y prendre pour travailler avec un espace de 54 octets que je remplis avec des nombres codés sur 1, 2 ou 4 octets, tel que dans la définition de ma structure ?
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
3 août 2004 à 22:29
ben en memoire l'adresse suivante apres ta struct sera un multiple de 4, donc au moins +56
il faut que tu considere 2 octets de bourrage, tu peux t'arranger pour qu'ils soient à la fin en mettant les 2 chars en dernier ( char = 1 octet donc adresse multiple de 1)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_khayyam Messages postés 51 Date d'inscription lundi 7 juin 2004 Statut Membre Dernière intervention 15 juillet 2005
3 août 2004 à 22:35
il ne m'est pas possible de mettre mes deux char à la fin, l'ordre des champs doit rester inchangé. mais s'il n'est pas possible de considérer une struct pour travailler avec un espace de 54 octets, vois-tu une autre solution, sachant que cet espace doit être rempli petit à petit par paquets de taille variables (de 1 à 4 octets à la fois) ?
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
3 août 2004 à 22:39
oui ;)

typedef struct
{
char att[54];
} Header;

apres cree ta petite bibliotheque de fonctions pour indexer les diffrents champs
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
3 août 2004 à 22:42
c'est sans doute pas la meilleur solution, mais je vois que ca
0
cs_khayyam Messages postés 51 Date d'inscription lundi 7 juin 2004 Statut Membre Dernière intervention 15 juillet 2005
3 août 2004 à 22:47
c'était là-dessus que j'étais parti mais j'avais eu des soucis alors j'avais voulu changer de structure de données. retour à la case départ.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 août 2004 à 22:53
Tu es absolument tenu par la forme de cette structure ?
Si est non, faut absolument la changer car tres mauvais comme djl te l'a explique. L'alignement correct des donnees est la 1ere chose a respecter au debut de l'ecriture d'un logiciel.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_khayyam Messages postés 51 Date d'inscription lundi 7 juin 2004 Statut Membre Dernière intervention 15 juillet 2005
3 août 2004 à 22:56
donc pour utiliser ce tableau [54], j'ai quelques soucis,

#define CTOI(C) (*(int*)&C)

unsigned char[54]={0};
CTOI(header[22])=hauteur;

alors, dès que hauteur dépasse le poids d'un octet (255), ça plante :-(
0
cs_khayyam Messages postés 51 Date d'inscription lundi 7 juin 2004 Statut Membre Dernière intervention 15 juillet 2005
3 août 2004 à 23:01
pour éclaicir la situation, si je veux écrire un nombre sur 4 octets aux octets 2,3,4,5, je dois mettre header[2]=toto ou header[5]=toto ?
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
3 août 2004 à 23:17
C'est quoi exactement l'alignement des données ?
Et comment savoir si c'est bien alignée ou pas ?
Quel est le probleme de structure dont l'alignement n'est pas correcte ?

Shell
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
3 août 2004 à 23:21
ca augmente la taille avec des trous dans l'alignement des donnée et dans un fichier binaire, les données seront lu differement suivant les architectures
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
3 août 2004 à 23:23
on avait vu recement l'exemple d'une structure mal aligné en 32bits et sous dos (16 bits) les données extraites etaient decalées
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 août 2004 à 23:26
Lecture ecriture donnees de taille:
1 octet aligne sur 1, en terme clair peut se trouver nimporte ou, aucun cycle de penalite.
2 octets (WORD): aligne multiple de 2, penalite car instruction ne sera pas parallelisee.
4 octets (DWORD): aligne multiple de 4, rendement maximum, se fait en 1 cycle processeur et toujours parallelisable.

ciao...
BruNews, Admin CS, MVP Visual C++
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
3 août 2004 à 23:27
djl> tu dis "char = 1 octet" ? ca serait pas plutot char= 2octets et unsigned char=1octet ?

Un char est codé sur 16bits et un unsigned char sur 8 ?

DU moins c'est ce dont je me rappelle .... Peut etre que je me trompe.

Shell
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
3 août 2004 à 23:29
tu te trompe, char = ascii dans le standard, pas de l'unicode ou autre
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
3 août 2004 à 23:31
un char est par defaut un entier signé sur 8 bits
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 août 2004 à 23:32
char = 1 octet, signe ou non n'entre pas dans l'affaire

ciao...
BruNews, Admin CS, MVP Visual C++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 août 2004 à 23:34
et puis jamais perdre de vue que signe et non signe ne sont qu'une façon de regarder cet octet, a la verite c'est toujours la meme chose.

ciao...
BruNews, Admin CS, MVP Visual C++
0
Rejoignez-nous