Newsgroup: it.comp.lang.c
Titolo: struct e record globale...

Ciao a tutti eiste un modo per risolvere questo problema?
 struct uno
{
char a[30];
char b[20];
}uno;
 struct due
{
char a[30];
char c[20];
}due;
vorrei che se uno.a="gatto" vorrei che anche due.a fosse ="gatto" e
viceversa..come se i due record puntassero allo stesso spazio di
memoria
Grazie


non mi e' molto chiaro cosa vuoi fare e soprattutto
a cosa ti serve! A provato con le union ?
Oppure:
typedef struct {char a[30], b[20];} Uno;
typedef struct {char a[30], c[20];} Due;
Uno *x;
Due *y;
x = malloc(sizeof(Uno));
y = (Due *) x;
ora x e y puntano alla stessa zona di memoria,
quindi con alta probabilita'
se fai
strcpy(x->a,"pippo");
e poi
printf("%s\n",y->a);
ti stampa "pippo".
ciao,
g.


oppure se vuoi che solo il primo campo coincida puoi fare:
typedef struct {char  *a, b[20];} Uno;
typedef struct {char  *a, c[20];} Due;
Uno x;
Due y;
y->a = x->a = malloc(30);
in questo modo solo i campi a dei due record puntano
alla stessa zona di memoria.
ciao,
g.

 viceversa..
#include <stdio.h>
#include <stdlib.h>
typedef struct {char a[20], b[20]} uno_t, *puno_t;
typedef struct {char a[20], b[20]} due_t, *pdue_t;
int main()
{
     puno_t p1=malloc(sizeof *p1);
     pdue_t p2=p1;
     if (p1) {
        strcpy(p1->a, "ciao");
        printf("p1=\"%s\"\np2=\"%s\"\n", p1->a, p2->a);
     }
     free(p1);
     free(p2);
     return 0;
}

Riformulo: 2 strutture diverse devono avere un "record in
comune".Modifico l'esempio di Andrea per esempio
#include<stdio.h>
#include<stdlib.h>
typedef struct{char a[20],b[20];} uno_t,*puno_t;
typedef struct{char c[10],a[20];} due_t,*pdue_t;
int main()
{ puno_t p1=malloc(sizeof *p1);
     pdue_t p2=p1;
     if (p1) {
	strcpy(p1->a, "gatto");
	strcpy(p1->b, "cane");
	strcpy(p2->a, "gallo");
	strcpy(p2->c, "serpente");
        printf("p1a=%s\np1b=%s\np2a=%s\np2c=%s\n", p1->a,
p1->b,p2->a,p2->c);
     }
     free(p1);
     free(p2);
     return 0;
}
ed ottengo
p1a=serpente
p1b=cane
p2a=gallo
p2c=serpente
invece vorrei
p1a=gallo
p1b=cane
p2a=gallo
p2c=serpente
Andrea Laforgia ha scritto:


 p2c=serpente
Mi sembra banale: modifichi la seconda strcpy perché copi "gatto", 
anziché "gallo".  Poi, che cosa intendi per "record in comune" ? 
in C non esiste un concetto di "record".

La soluzione che cercavo è la seconda postata da Giovanni(che non
riuscivo a visualizzare), posto il codice:
#include<stdio.h>
#include<stdlib.h>
struct
{
	char *a;
	b[20];
	} uno;
struct
{
	char c[10];
	char *a;
	}
	due;
int main()
{
due.a=uno.a=(char *)malloc(30);
        strcpy(uno.a, "gatto");
	strcpy(uno.b, "cane");
	strcpy(due.a, "gallo");
	strcpy(due.c, "serpente");
	printf("p1a=%s\np1b=%s\np2a=%s\np2c=%s\n", uno.a,uno.b,due.a,due.b);
     free(uno.a);
     return 0;
}
Grazie a tutti per l'aiuto, ciao
Andrea Laforgia ha scritto:


 La soluzione che cercavo è la seconda postata da Giovanni
[...]
...e che è analoga a quella che ti ho postato io...


No, la prima che avevo postato era analoga alla tua.
Nella seconda invece invece che far coincidere il
puntatore alla struttura facevo coincidere i
puntatori a due campi:
typedef struct {char  *a, b[20];} Uno;
typedef struct {char  *a, c[20];} Due;
Uno x;
Due y;
y->a = x->a = malloc(30);
ciao,
g.

 puntatori a due campi
E' qui che ci vedo l'analogia ;-)

      free(p2);
ma che roba e' questa?
Non mi sembra molto elegante la tua soluzione che si basa sul fatto che
i campi della seconda struttura non coincidano con quelli della prima.
L'area di memoria di p2->c coincide con la prima parte di p1->a e l'area
di p2->a coincide con la seconda parte di p1->a e la prima parte di
p1->b...
Umh.. e' una ricetta per disastri!
inoltre perche usa la free due volte?
Tommaso
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 }
basta la prima free.


 E' qui che ci vedo l'analogia ;-)
sicuro?


 sicuro?
Sě.

 inoltre perche usa la free due volte?
Era il mio codice sbagliato (perché l'ho modificato in seguito, 
togliendo un'allocazione ma non rimuovendo la free ;-)... 
ovviamente andava preso solo come spunto...

 basta la prima free.
Ma va ? :-)

>> E' qui che ci vedo l'analogia ;-)
Io no!


 Io no!
E sti gran cazzoni.  Non devi riassumere il mio codice, perché so 
benissimo che cosa ho scritto.  L'analogia è nell'uso dei 
puntatori per puntare alla stessa area di memoria.

 Andrea ha *sempre* ragione ;-)
Taci, idiota.

 puntatori per puntare alla stessa area di memoria.
Ok, questo e' comprensibile ed ha senso, ma allora credo che, un paio di
post fa, tu abbia frainteso Giovanni che invece voleva al contrario
distinguere le due versioni (non analoghe).
Ad ogni modo non importa. Vi/Ci siete/siamo fraintesi, ed ora ci siamo
compresi.


 ???
Devi avere pazienza, patisco un pò il caldo e non vedo l'ora di 
andare in ferie ;-)

 andare in ferie ;-)
;-)
Qua a Cambridge ci sono 15 gradi... certamente non patisco il caldo, ma
non vedo l'ora di andare anche io in ferie.
Peccato che ci sono appena stato pero' :-( 
Beh, dai, almeno e' venerdi'!
Buon weekend,


 in ferie ;-)
A te non servono le ferie.  Ti servirebbe un corso di buone maniere.



Maleducato come al solito.
Smettero` quando smetterai di offendere.


 Maleducato come al solito.
Idiota, come al solito.

 A te non servono le ferie.  Ti servirebbe un corso di buone maniere.
A te invece servirebbe un ricovero coatto in qualche clinica in 
cui curino l'idiozia.  Non ce ne sono molte che possano curare 
casi gravi come il tuo.


  Maleducato come al solito.




Smettero` di parlare qundo smetterai di offendere.


  Maleducato come al solito.
Shh.. silenzio, vai a parlare di regole condominiali e non rompere i 
coglioni.

 Smettero` di parlare qundo smetterai di offendere.
Taci, idiota.


Una voce poco fa
qui nel cor mi risuonò;
il mio cor ferito è già,
e Lindor fu che il piagò.
Sì, Lindoro mio sarà;
lo giurai, la vincerò.
Il tutor ricuserà,
io l'ingegno aguzzerò.
Alla fin s'accheterà
e contenta io resterò.
Sì, Lindoro mio sarà;
lo giurai, la vincerò.
Io sono docile, son rispettosa,
sono obbediente, dolce, amorosa;
mi lascio reggere, mi fo guidar.
Ma se mi toccano dov'è il mio debole
sarò una vipera e cento trappole
prima di cedere farò giocar.



Una voce poco fa
qui nel cor mi risuonò;
il mio cor ferito è già,
e Lindor fu che il piagò.
Sì, Lindoro mio sarà;
lo giurai, la vincerò.
Il tutor ricuserà,
io l'ingegno aguzzerò.
Alla fin s'accheterà
e contenta io resterò.
Sì, Lindoro mio sarà;
lo giurai, la vincerò.
Io sono docile, son rispettosa,
sono obbediente, dolce, amorosa;
mi lascio reggere, mi fo guidar.
*_Ma se mi toccano dov'è il mio debole
sarò una vipera e cento trappole
prima di cedere farò giocar._*
