Newsgroup: it.comp.lang.c
Titolo: Confronto strutture

Qual'è il modo più efficiente per testare l'uguaglianza di due variabili 
struct ? E' necessario confrontare i loro campi uno ad uno ?
Grazie...:)
-- 
Lorenzo

 struct ? E' necessario confrontare i loro campi uno ad uno ?
Credo che si possa usare con successo anche memcmp col sizeof della struct.
Ciao
- -- 
No matter. Try again. Fail again. Fail better.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.2 (GNU/Linux)
iD8DBQE/Ff7hQb6qi6QXZLkRAvHLAJ47xUV8Mu/iCBsLitS4XpFrmHRP+wCfefR6
Wc1aGOVFucfCfrX0tcUwRWE=
=OVin
-----END PGP SIGNATURE-----

Se sono strutture dello stesso tipo, è sufficiente la normale condizione:
if (Struttura1 == Struttura2)
   ...
--------------------------------
Inviato via 
http://usenet.libero.it

    ...
<CODE>
#include <stdio.h>
struct test{
  int i;
  double j;
};
int main(void)
{
  struct test Struttura1 = {1, 25.3};
  struct test Struttura2;
  Struttura2 = Struttura1;
  if(Struttura1 == Struttura2)
    printf("Questa Non la sapevo!\n");
  return 0;
}
</CODE>
La compilazione di questo codice mi si incarta sull'if()...
Dove sbaglio?
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Credo che si possa usare con successo anche memcmp col sizeof della struct.
Meglio di no. Le strutture hanno del padding per velocizzare l'accesso
ai membri (uno short in una struttura potrebbe occupare lo spazio di un
int). Nessuno ti garantisce che il padding sia azzerato, memcmp potrebbe
dire che le strutture sono diverse anche se in realta' i membri hanno
gli
stessi valori.


 struct ? E' necessario confrontare i loro campi uno ad uno ?
Si.


 La compilazione di questo codice mi si incarta sull'if()...
non si puo' confrontare in quel modo, con le structs è valido al massimo
l'operatore di assegnamento, non di confronto (nel c++ dovrebbe funzionare
anche == credo).
La cosa migliore per confrontare è scrivere una funzione apposita che
controlla uno ad uno i campi (se sono pochi), oppure esegue memcmp (facendo
attenzione ai byte di padding presenti nella struct. Se sono presenti
andrebbero azzerati per sicurezza prima di ogni confronto, anche se
probabilmente un memset(&Struttura,0,sizeof(struct blah)) prima di
inizializzare la struttura dovrebbe bastare).
Ciao.
- -- 
No matter. Try again. Fail again. Fail better.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.2 (GNU/Linux)
iD8DBQE/Fkw/Qb6qi6QXZLkRAjC7AJ9vYRNMsUqplwvPzr4bIbt6naKbkwCbBZTs
6poalrfjHg2IWpfCzWivhao=
=1cq6
-----END PGP SIGNATURE-----

 inizializzare la struttura dovrebbe bastare).
Ovvero? Posta un pezzo di codice esplicativo.


 Ovvero? Posta un pezzo di codice esplicativo.
data una struct prova {
        short a;
        int b;
        char c;
        char d[5];
};
per eseguire confronti "sicuri" con memcmp..
struct prova p,p1;
memset(&p,0,sizeof(struct prova));
memset(&p1,0,sizeof(struct prova));
prima di riempire con i dati la struttura. Ad esempio
p.a=1;p1.a=1;
p.b=2;p1.b=2;
p.c='A';p1.c='A';
strncpy(p.d,"abcd",5);
strncpy(p1.d,"abcd",5);
disassemblando (le prime 6 istruzioni sono quelle che potrebbero portare a
"contaminazioni" nei byte di pad) risulta, col gcc
        movw    $1, -24(%ebp)
        movw    $1, -40(%ebp)
        movl    $2, -20(%ebp)
        movl    $2, -36(%ebp)
        movb    $65, -16(%ebp)
        movb    $65, -32(%ebp)
Quindi sembra ragionevolmente sicuro usare memcmp.
Sarebbe interessante vedere se tutti i compilatori sono così diligenti da
specificare in ogni caso il size nelle operazioni di scrittura sulla
struct.
Ciao
- -- 
No matter. Try again. Fail again. Fail better.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.2 (GNU/Linux)
iD8DBQE/FogYQb6qi6QXZLkRApPPAKCXRjdOHOwzaOkjrfbnLzLOwqZs8gCeKhZx
rJEzDJ5FxMq/Ud9ivfmsvg8=
=aEmD
-----END PGP SIGNATURE-----

 struct.
????
