Article View: fr.comp.lang.c
Article #15010Re: Struct/Union avec les memes champs
From: Marc Boyer
Date: Wed, 19 Oct 2005 13:19
Date: Wed, 19 Oct 2005 13:19
99 lines
5147 bytes
5147 bytes
Le 19-10-2005, Antoine Leca <root@localhost.invalid> a �crit�:
> Marc Boyer wrote:
>
> Ce genre de question sont trait�es (par forc�ment de mani�re limpides ;-))
> dans les paragraphes 6.2 et 6.3. Bonne lecture (non, je ne fournis pas
> l'aspirine...)
Bon, que cela ne t'apparaisse pas limpide � toi non plus
rend ma propre interrogation moins honteuse.
> En g�neral, plut�t que int, il vaut mieux r�fl�chir avec des types tordus,
> genre long double 80 bits sur Intel...
OK
>> A) Struct qui commencent pareil
>> Soient
>> typedef struct { int i; } Si;
>> typedef struct { int i; char c;} Sic;
>> Sic sic;
>> Si* psi= (Si*) &sic;
>> psi->i= 1; // Est-ce l�gal ? Si oui, un ref ?
>
> D'une part,
>
> 6.2.5 Types
>
> [#26] All pointers to
> structure types shall have the same representation and
> alignment requirements as each other. All pointers to union
> types shall have the same representation and alignment
> requirements as each other. Pointers to other types need
> not have the same representation or alignment requirements.
>
> me para�t interdire une impl�mentation o� les propri�t�s de Si* et Sic*
> (genre des types diff�rents de segmentation, _huge* contre _far* ou ce genre
> d'horreur) les rendraient incommensurable, donc je pense que le transtypage
> de la ligne sup�rieure est l�gal (pas faire boum).
>
> � partir de l�, l'affectation en elle-m�me ne me para�t pas poser de
> probl�me... tant que l'on en reste l� !
>
> Par contre, je me pose des questions sur la suite, par exemple sur une
> possible subs�quente utilisation de sic.c qui aurait �t� pr�alablement
> initialis�...
> Par exemple, imaginons une architecture o� l'acc�s � un Si ou � un Sic a le
> m�me co�t pour le processeur [non, je ne fournis pas l'aspirine]. Un
> compilateur normal va donc allouer la m�me taille aux deux structures (avec
> plus de remplissage au bout de Si). L'affectation via psi->i n'a pas de
> raison de s'int�resser particuli�rement � cet espace de remplissage, et
> comme sur mon hypoth�tique machine c'est moins cher de ranger le tout en
> bloc, l'affectation va potentiellement �craser le membre c...
En effet.
> �videmment, dans ton cas particulier avec un membre de type int, j'ai
> beaucoup de mal � imaginer une telle machine ;-). Mais remplace int par long
> double et alors l�...
OK.
> L'utilisation d'une union englobante pour faire valoir la r�gle de 6.5.2.3p5
> comme l'explique tr�s bien Jean-Marc par ailleurs, ne vaut que pour les
> examens ("permitted to inspect the common initial part"), donc pour moi ne
> s'applique pas ici.
"inspect" vs "access" Faut faire attention � chaque mot en effet.
> La question � laquelle je ne r�pond pas (sciemment), c'est la valeur de
> sic.i apr�s l'affectation via psi->i :-)
Pourtant, �a me semble moins dur que le reste.
>> B) Union avec les m�me champs
>> union { char j,k; } f;
>> f.j= 'a';
>> assert( f.j == f.k); // Est-ce l�gal ? Si oui, ref ?
>
> 6.2.6 Representations of types
> 6.2.6.1 General
>
> [#7] When a value is stored in a member of an object of
> union type, the bytes of the object representation that do
> not correspond to that member but do correspond to other
> members take unspecified values, but the value of the union
> object shall not thereby become a trap representation.
>
> Donc cela parait l�gal (pas possible de faire sauter la baraque), mais par
> contre ton programme n'est pas strictement conforme (on peut imaginer des
> impl�mentations qui surveillent l'assignations aux membres des unions, donc
> vont r�pondre non � l'assertion et faire varier le comportement du
> programme).
C'est � dire qu'on a pas (void*)&f == (void*)&f.j == (void*) &f.k ?
Marc Boyer
--
� v�lo, prendre une rue � contre-sens est moins dangeureux
que prendre un boulevard dans le sens l�gal. � qui la faute ?
Technical Details
Message-ID:
<slrndlci4l.a9d.Marc.Boyer@localhost.localdomain>Path:
arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!proxad.net!fr.ip.ndsoftware.net!ciril.fr!univ-lille1.fr!news.cict.fr!not-for-mailReferences:
<slrndlbo6u.9sr.Marc.Boyer@localhost.localdomain> <dj5gg0$ie9$1@shakotay.alphanet.ch>Show Full Headers
Complete Article Headers
X-Google-Thread: f9822,eb7f26af12505976 X-Google-Attributes: gidf9822,public X-Google-Language: FRENCH,ASCII Path: arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!proxad.net!fr.ip.ndsoftware.net!ciril.fr!univ-lille1.fr!news.cict.fr!not-for-mail From: Marc Boyer <Marc.Boyer@enseeiht.yahoo.fr.invalid> Newsgroups: fr.comp.lang.c Subject: Re: Struct/Union avec les memes champs Date: Wed, 19 Oct 2005 13:19:56 +0000 (UTC) Organization: CICT Lines: 99 Message-ID: <slrndlci4l.a9d.Marc.Boyer@localhost.localdomain> References: <slrndlbo6u.9sr.Marc.Boyer@localhost.localdomain> <dj5gg0$ie9$1@shakotay.alphanet.ch> Reply-To: Marc.Boyer@enseeiht.yahoo.fr (del yahoo) NNTP-Posting-Host: ubu.enseeiht.fr Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Trace: news.cict.fr 1129727996 16282 147.127.19.155 (19 Oct 2005 13:19:56 GMT) X-Complaints-To: usenet@news.cict.fr NNTP-Posting-Date: Wed, 19 Oct 2005 13:19:56 +0000 (UTC) User-Agent: slrn/0.9.8.1 (Debian)