Newsgroup: it.comp.lang.c
Titolo: Ma in definitiva... la copia di strutture è ANSI?!?!

Buongiorno,
ho letto con interessa la lunga serie di messaggi relativi alle
strutture.
Mi resta tuttavia il dubbio che vado ad illustrarvi. Supponiamo che io
abbia definito un nuovo tipo con un istruzione del tipo
typedef struct {
   /* Membri */
} T_mytype;
ed che in seguito, dette a e b due variabili di tipo T_mytype,
effettui un'assegnazione del tipo
a = b;
Ho letto che qualcuno sostiene che un'assegnazione del genere non sia
conforme allo standard ANSI. Io sapevo che la copia avveniva
semplicemente byte per byte... ma che era corretta: per caso non è
così?
Fra l'altro il compilatore (gcc) non mi genera né errori né
warnings... anche specificando sulla riga di comando i parametri
-ansi, -pedantic e -Wall.
Ringrazio tutti per l'attenzione,
Stefano B.

 conforme allo standard ANSI.
????
Vuoi levarmi una delle poche certezze riguardo alle strutture? :-)
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 > conforme allo standard ANSI.
La copia delle struct e' ANSI in C++, in cui viene equiparata alla copia
delle classi.
In C, non sono sicuro, e ad essere sincero ho dei dubbi.
Il GCC cmq e' un compilatore C++, quindi come da C++ standard ANSI te la
passa per buona.


L'assegnamento tra strutture dello stesso tipo è valido e appartiene allo
standard (penso al C99).
--------------------------------
Inviato via 
http://usenet.libero.it

 In C, non sono sicuro, e ad essere sincero ho dei dubbi.
Levateli.


 standard (penso al C99).
Non solo, anche allo standard vecchio (C89 a ANSI C che dir si voglia).
-- 
Enrico 'Trippo' Porreca

conforme allo standard ANSI. 
Non č vero, lo č.  I primi compilatori C avevano problemi con questo
tipo di operazioni ma oggigiorno l'assegnazione tra strutture č
contemplata dallo standard ANSI/ISO.  Un'assegnazione tra strutture
viene compiuta in modo "monolitico" (byte per byte).  Probabilmente la
confusione nasce dal fatto che non č supportato, dallo standard, il
*confronto* tra due strutture.  Cioč, se č lecito scrivere (date a e b
due struct):
a = b;
Non č altrettanto lecito confrontare:
if (a == b) ...
Difatti, mentre per l'assegnazione va bene copiare in modo monolitico,
il confronto va invece fatto campo per campo, scrivendosi una propria
funzione.

 if (a == b) ...
Ecco, io mi sono sempre chiesto: ma perche' e' cosi'?? :P
-- 
/**
 * Mattia Belletti - Undergraduate student @ 
cs.unibo.it
 * ICQ: 33292311   - email: 
mbel...@cs.unibo.it
 * IRC: BluShine   - site(s): 
http://cs.unibo.it/~mbellett
 * Linux registered user 299762 @ Linux registered machine 184987
 */

 Ecco, io mi sono sempre chiesto: ma perche' e' cosi'?? :P
http://www.eskimo.com/~scs/C-faq/q2.8.html
-- 
Enrico `Trippo' Porreca

Ecco, io mi sono sempre chiesto: ma perche' e' cosi'?? :P
   Io sono contento che sia cosi`. :)
   In generale un `memcmp' tra due strutture non e` un metodo
sufficiente per confrontarle anche in assenza di byte di padding ecc.
   Faccio qualche esempio:
struct frutto {
   char  nome[128];
   char *origine;
   int   commestibile;
   ...
} a, b;
   per una struttura del genere, nel mio programma potrei considerare
uguali `a' e `b', anche se `a.origine != b.origine' purche`
`strcmp(a.origine, b.origine) == 0'. Analogamente potrei considerare
uguali i campi `commestibile', anche se uno vale 1 e l'altro -1.
   Oltretutto, per come funziona di solito strcpy, se in `a.nome'
avessi inserito prima `arancia' e poi `mela', potrei trovarmi in
memoria "mela\0ia...", che a un confronto byte a byte risulterebbe
diverso dall'eventuale "mela\0\0\0..." di `b.nome'.
   Insomma, questo per dire che secondo me, in molti casi reali, un
confronto tra strutture fornito dal linguaggio sarebbe quanto meno
inutile.
-- 
S.L.