🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: Struct/Union avec les memes champs

#15006
From: Harpo
Date: Wed, 19 Oct 2005 13:04
98 lines
4076 bytes
Marc Boyer wrote:

> Le 19-10-2005, Harpo <trashcan@hotmail.com> a �crit�:
>> Marc Boyer wrote:
>>
>>> 
>>> A) Struct qui commencent pareil
>>>   Soient
>>> typedef struct { int i; } Si;
>>> typedef struct { int i; char c;} Sic;
>>> int main(){
>>>    Sic sic;
>>>    Si* psi= (Si*) &sic;
>>>    psi->i= 1;   // Est-ce l�gal ? Si oui, un ref ?
>>
>> // J'esp�re, Il n'y a rien de plus anodin. Si ce n'�tait pas l�gal
>> les // prisons seraient pleines de programmeurs C.

>   Oui, mais j'aurais aim� retrouver une ref. Et je suis assez
> mauvais en recherche dans la norme.

Pour te r�pondre, je me suis bas� sur une question que j'ai pos�e cet
�t� sur fclc, j'ai m�me eu des r�f�rences de la norme.

Dans ton cas, tu as :
( &sic == &(sic.i) )
et ( psi ==  psi->i )

Cela semble �vident, mais pas tant que �a, car si les structures
semblent devoir respecter un alignement de ses membres, elles
pourraient r�arranger ceux-ci.
Je m'�tais rendu compte que je m'�tais bas� sur cette assertion apr�s
avoir �crit des fonctions qui �tait bas�es l�-dessus, on m'a tout de
suite rassur� sur fclc.
Donc n'angoisse pas � ce sujet.

> 
>   Oui, mais j'aurais aim� retrouver une ref. Et je suis assez
> mauvais en recherche dans la norme.
> 
>>> }
>>> 
>>> B) Union avec les m�me champs
>>> #include <assert.h>
>>> typedef struct  {
>>>   int i;
>>>   union {
>>>     char j;
>>>     char  k;
>>>   };
>>> } foo;
>>> int main(){
>>>    foo f;
>>>    f.j= 'a';
>>>    assert( f.j == f.k); // Est-ce l�gal ? Si oui, ref ?
>>
>   Sauf que f.k n'a peut-�tre pas �t� initialis�, donc, UB.

Ce serait tordu, je n'ai pas de ref, mais si ce n'�tait pas dans la
norme, cela voudrait die que
union {
  char j;
  char  k;
};
ne serait pas �quivalent � :
union {
  char  k;
  char j;
};

Je ne pense pas que quelqu'un ait �crit un compilo assez tordu pour
faire accepter cela dans la norme.

> 
>> Je pense m�me que l'on peut dire :
>> assert( &(f.j) == &(f.k) ) quelque soit leur type du fait qu'ils sont
>> au d�but de l'union.
> 
>   C'est mon intuition en effet, et si on a &X == &Y, X et Y de m�me
> type, alors X == Y.

C'est souhaitable sur une machine non-approximative.

> 
>   Je sais plus de quand datent les unions anonymes. Je les ai
> d�couvert r�cemment en ce qui me concerne.

C'est Pierre Habouzit qui me les fait d�couvrir il y a peu. J'ai regard�
sur la doc de GCC, c'est je crois pr�sent� comme une extension, comme
d'autres extensions maintenant dans la norme C99.

Je ne pense pas que cela soit une bonne mani�re de faire bien que cela
apporte une facilit� d'�criture.
Cela du fait que 2 structures englob�es dans une autre structure ne
pourraient pas  contenir des champs de m�me nom ni un nom utilis�e dans
la structure les englobant. De plus souvent lorsque l'on fait des
structures, c'est souvent pour les utiliser plusieurs fois et de toute
mani�re la facilit� apport�e est illusoire.
Technical Details
Message-ID: <43564458$0$1747$8fcfb975@news.wanadoo.fr>
Path: arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!proxad.net!193.252.118.146.MISMATCH!news.wanadoo.fr!news.wanadoo.fr!not-for-mail
References: <slrndlbo6u.9sr.Marc.Boyer@localhost.localdomain> <435613e5$0$1716$8fcfb975@news.wanadoo.fr> <slrndlcd38.a9d.Marc.Boyer@localhost.localdomain>

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!193.252.118.146.MISMATCH!news.wanadoo.fr!news.wanadoo.fr!not-for-mail
Message-ID: <43564458$0$1747$8fcfb975@news.wanadoo.fr>
From: Harpo <trashcan@hotmail.com>
Subject: Re: Struct/Union avec les memes champs
Newsgroups: fr.comp.lang.c
Date: Wed, 19 Oct 2005 15:04:22 +0200
References: <slrndlbo6u.9sr.Marc.Boyer@localhost.localdomain> <435613e5$0$1716$8fcfb975@news.wanadoo.fr> <slrndlcd38.a9d.Marc.Boyer@localhost.localdomain>
Organization: ARG ; Association pour la Rehabilitation du Goto
User-Agent: KNode/0.8.2
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8Bit
Lines: 99
NNTP-Posting-Date: 19 Oct 2005 15:04:24 CEST
NNTP-Posting-Host: 86.195.226.91
X-Trace: 1129727064 news.wanadoo.fr 1747 86.195.226.91:32905
X-Complaints-To: abuse@wanadoo.fr