Article View: fr.comp.lang.c
Article #15522Re: alignements struct/tableaux
From: Pierre Habouzit
Date: Sat, 17 Sep 2005 20:10
Date: Sat, 17 Sep 2005 20:10
103 lines
4393 bytes
4393 bytes
harpo wrote:
> On Sat, 17 Sep 2005 21:04:24 +0200, Pierre Habouzit wrote:
>
>>
>> hmmm, c'est bien dommage.
>>
>> J'ai des structures dont un des membres est l'indice dans le tableau de
>> mon union, du pointeur auquel il font r�f�rence. ca m'aurait permis de
>> faire des trucs du genre :
>>
>> bar->array[baz->some_index]
>>
>> Mais lorsque j'y acc�de textuellement je voulais �viter des
>> bar->array[MY_UNION_FIRST] ... et donc pouvoir acc�der aux pointeurs du
>> tableau par leur "nom".
>
> Excusez-moi, mais j'ai du mal � comprendre votre probl�me; ce n'est pas
> � la port�e d'un d�butant, est-ce que vous pourriez le pr�ciser pour
> que tout le monde suive ?
pour mettre un peu de background, j'ai (ou plutot j'aurais aim� avoir) une
premi�re structure :
struct message {
[ ... pleins de choses dont pas mal de 'headers' ...];
union {
struct {
const blob_t *original;
blob_t *scratch;
};
blob_t *__bufs[2];
};
[ ... encore pleins de choses ...];
};
struct header {
struct { /* expans�, en fait c'est un sous type */
ssize_t start;
ssize_t size;
} value;
[ ... qqs trucs ...];
int modified:1;
[ ... d'autres bits ...];
};
un blob_t est une structure qui me permet de g�rer des tableaux d'octets
quelconques (pour faire simple). et un header d�finit une sous partie d'un
des deux buffer (original ou scratch) de ma structure message.
j'ai potentiellement pas mal de header, et je ne veux donc pas y avoir de
pointeur sur un blob_t*, d'autant que j'ai d�j� d'autres bits dans la
structure.
avec une telle construction, ca m'aurait permis d'�crire :
msg->__bufs[hdr->modified]
pour acc�der au bon blob_t qui contient la valeur du header. je voulais
�viter d'avoir � �crire :
(hdr->modified) ? msg->scratch : msg->original;
si je n'avais gard� que la struct dans l'union, ou bien pire, d�finir des
MESSAGE_ORIGNINAL � 0 et MESSAGE_SCRATCH � 1 pour pouvoir acc�der aux deux
buffers dans mes fonctions o� je les manipule, via des
msg->bufs[MESSAGE_ORIGINAL].
mais du coup, vu que je ne peux garantir que scratch coincide avec la
deuxi�me case du tablea __bufs, je me suis r�sign� � avoir comme type pour
mes messages :
struct message {
[ ... pleins de choses dont pas mal de 'headers' ...];
struct {
const blob_t *original;
blob_t *scratch;
};
blob_t *__bufs[2];
[ ... encore pleins de choses ...];
};
ce qui me force � maintenir l'invariant __bufs[0] == original et
__bufs[1]==scratch � la main, mais vu que ces pointeurs changent peu, c'est
pas trop g�nant pour moi, et autant je ne voulais pas perdre la taille d'un
pointeur en plus dans mes headers vu que j'en ai beaucoup et que j'avais
d�j� des champs de bits, mais perdre 16 octets dans la structure de message
n'est pas trop g�nant. (enfin 16 ou plutot sizof(blob_t*)*2)
--
�O� Pierre Habouzit
��O madcoder@debian.org
OOO http://www.madism.org
Technical Details
Message-ID:
<432c77ed$0$12670$626a14ce@news.free.fr>Path:
arc1-ca.pugleaf.net!g2news1.google.com!news2.google.com!proxad.net!infeed-3.proxad.net!news18-e.free.fr!not-for-mailReferences:
<432c52d5$0$9425$626a14ce@news.free.fr> <mn.8cb87d59c7031bee.15512@YOURBRAnoos.fr> <432c688a$0$14382$626a14ce@news.free.fr> <432c6c63$0$17061$8fcfb975@news.wanadoo.fr>Show Full Headers
Complete Article Headers
X-Google-Thread: f9822,2ab126dba8e5e645
X-Google-Attributes: gidf9822,public
X-Google-Language: FRENCH,ASCII
Path: arc1-ca.pugleaf.net!g2news1.google.com!news2.google.com!proxad.net!infeed-3.proxad.net!news18-e.free.fr!not-for-mail
Message-ID: <432c77ed$0$12670$626a14ce@news.free.fr>
From: Pierre Habouzit <madcoder@debian.org>
Subject: Re: alignements struct/tableaux
Newsgroups: fr.comp.lang.c
Date: Sat, 17 Sep 2005 22:10:09 +0200
References: <432c52d5$0$9425$626a14ce@news.free.fr> <mn.8cb87d59c7031bee.15512@YOURBRAnoos.fr> <432c688a$0$14382$626a14ce@news.free.fr> <432c6c63$0$17061$8fcfb975@news.wanadoo.fr>
User-Agent: KNode/0.9.2
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-15
Content-Transfer-Encoding: 8Bit
X-Face: $(^e[V4D-[`f2EmMGz@fgWK!e.B~2g.{08lKPU(nc1J~z\4B>*JEVq:E]7G-\6$Ycr4<;Z!|VY6Grt]+RsS$IMV)f>2)M="tY:ZPcU;&%it2D81X^kNya0=L]"vZmLP+UmKhgq+u*\.dJ8G!N&=EvlD
Lines: 103
Organization: Guest of ProXad - France
NNTP-Posting-Date: 17 Sep 2005 22:09:17 MEST
NNTP-Posting-Host: 82.225.205.10
X-Trace: 1126987757 news18-e.free.fr 12670 82.225.205.10:52413
X-Complaints-To: abuse@proxad.net