En peker til noen av spissen erklærte strukturer i C

stemmer
1

Jeg har et spørsmål om termin erklæringer i C. Problemet kode er

typedef struct yhash_s t_yhash;                          // forward declaration
struct yhash_s {
               size_t  size_h; 
               t_yhash (*yhash)[]                        // pointer to array of structures
               };

Når koden er kompilert med gcc, klager det:

error: array type har ufullstendig element type 't_yhash' {aka 'struct yhash_s'}

Jeg forstår at t_yhash er ikke (ennå) og størrelsen på matrisen kan ikke beregnes, men jeg ber om pekeren til en rekke ukjente ennå størrelse, som bør være helt løses IMHO.

Hvordan kan jeg fikse det frem erklæring og konstruere seg selv?

Publisert på 13/01/2020 klokken 21:59
kilden bruker
På andre språk...                            


2 svar

stemmer
4

Problemet er at matrise declarators kan ikke ha en ufullstendig type som den elementtype (C11 6.7.6.2/1). Og t_yash(ie struct yhash_s) er ikke komplett før den avsluttende spenne av struct definisjon.

Denne regelen er også ansvarlig for et annet stykke trivia; det er lovlig å ha (før struct definisjonen er komplett):

void func( t_yhash *a );

men ikke lovlig å ha:

void func( t_yhash a[] );

selv om justeringen regelen ville fungere helt fint om ikke for ufullstendig element type regelen.

Sannsynligvis språket design kan forbedres noe ved å avgrense denne regelen til å tillate noen tilfeller som funksjon prototype, men det var helt klart ikke noe som oppsto med språket utformingen komiteen.

Men selv uten denne regelen, kan det hende at use case har et annet problem; størrelsen av pekeren kan ikke være kjent. Det ville være lovlig (selv om usannsynlig i praksis) for "-pekeren til noen av struct X" for å ha en annen størrelse enn "-pekeren til noen av struct Y". Det er en regel som alle pekere til konstruere må ha samme størrelse, men ingen slik regel for pekere til array.

Svarte 13/01/2020 kl. 22:24
kilden bruker

stemmer
0

Som svar på denne delen av innlegget ditt:

Hvordan kan jeg fikse det frem erklæring og konstruere seg selv?

Du kan bruke void *til å stash din array, og deretter konvertere den tilbake senere.

typedef struct yhash_s t_yhash;
struct yhash_s {
               size_t  size_h;
               void *yhash;
               };

static inline t_yhash (*yhash(t_yhash y))[] {
    return y.yhash;
}

Hvis funksjonen syntaks er for stumpe:

typedef t_yhash t_yhash_array[];

static inline t_yhash_array *yhash(t_yhash y) {
    return y.yhash;
}

For eksempel:

t_yhash x[10];
t_yhash y = { 10, &x };
assert(yhash(y) == &x);
Svarte 13/01/2020 kl. 23:38
kilden bruker

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