Hvorfor kan jeg ikke tildele hverandre med to structs som har identiske innholdet?

stemmer
5

Jeg prøver å lære C og jeg har kommet over noe rart:

struct
{
  int i;
  double j;
} x, y;

struct
{
  int i;
  double j;
} z;

Her kan du se jeg laget to structs som er identiske i sine elementer.

Hvorfor er det slik at når jeg prøver å tildele x = zvil det generere en kompileringsfeil men x = yikke? De har samme innhold, så hvorfor kan jeg ikke tildele dem frem og tilbake med hverandre, uansett?

Er det noen måte jeg kan gjøre dette så jeg kan tildele x = z? Eller har de rett og slett nødt til å være den samme struct.

Kan noen C guruer peke meg i riktig retning?

Publisert på 13/04/2009 klokken 16:33
kilden bruker
På andre språk...                            


5 svar

stemmer
13

De har samme innhold, men ikke samme type. Hvis de er ment å være av samme type, bare typedef x z;. Hvis de ikke er det samme, men bare tilfeldigvis inneholder de samme feltene, er det bedre å lage en egen funksjon som vil tildele feltene riktig.


Min vanlige stil for å erklære structs i C omfatter typedef, så jeg glemte å nevne det (sorry!). Her er syntaksen:

typedef struct
{
  int foo;
  double bar;
} x;

/* Further down, if needed */
typedef x z;
Svarte 13/04/2009 kl. 16:36
kilden bruker

stemmer
8

Making identisk strukturerte typer samme er kalt " duck typing ". Dette gjøres i noen språk, men ikke i C.

Svarte 13/04/2009 kl. 16:37
kilden bruker

stemmer
6

Kompilatoren beregner ikke "type likeverdighet" mellom structs som kan ha samme struktur, så så langt som det er opptatt av, har den andre struct ingenting å gjøre med det første.

Det kan gjøre x og y fordi de er deklarert på samme tid.

Hvorfor er du redeclaring struct? Du bør nok typedef struct gang (for eksempel i en H-fil) for å gjøre det en faktisk type, og deretter erklære tilfeller.

Her er en god tutorial på typedefs for structs.

Svarte 13/04/2009 kl. 16:37
kilden bruker

stemmer
5
struct mystruct
{  
int i;  
double j;  
};

struct mystruct x, y;
struct mystruct z;

Hvis du har tenkt å kopiere data mellom dem, må du deklarere dem med samme identitet. Du har to erklæringer, spiller det ingen rolle at de er like for kompilatoren, de er to forskjellige strukturer, og kompilatoren er ikke ment å avdekke deres likhet.

Svarte 13/04/2009 kl. 16:38
kilden bruker

stemmer
0

C skiller structs basert på navn, og hvis de er anonyme, så forskjellig struktur definisjoner er forskjellige.

Anyhow, ikke klassisk C ikke tillate x = znår xog zer structs - er at en ANSI eller en C99 tillegg? Uansett, bør du i stedet bruke

#include <string.h>
memcpy(&x, &z, sizeof(x));
Svarte 13/04/2009 kl. 16:43
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more