🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fr.comp.lang.c
Article #15522

Re: alignements struct/tableaux

#15522
From: Pierre Habouzit
Date: Sat, 17 Sep 2005 20:10
103 lines
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-mail
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>

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