C Structs og arrayer

stemmer
0

Jeg kan ikke få koden under for å kompilere (se feil). Råd om korreksjon ville være verdsatt.

#include <stdio.h>

typedef struct {
  char    *fldName;
  unsigned fldLen;
} Field;

typedef struct {
  char    *fldPrompt;
  unsigned startRow;
  unsigned startCol;
} Prompt;

typedef struct {
  Field   *fields[];
  Prompt  *prompts[];
  unsigned numFlds;  <<< invalid field declaration after empty field 
} Form;                    <<< in '(incomplete) struct (no name)'.

Field  firstName = { fName, 12 };
Field  surName   = { sName, 25 };
Field  gender    = { gder, 1 };

Prompt fn        = { First Name : , 4, 10 };
Prompt sn        = { Surname    : , 6, 10 };
Prompt gn        = { Gender     : , 8, 10 };

int main (void)
{
  Form aForm = { { &firstName, &surName, &gender },
                 { &fn, &sn, &gn}, 
                 3 };  <<<  Multiple initializers for the same element
  return 0;             <<<  Too many initializers
}
Publisert på 15/07/2009 klokken 06:53
kilden bruker
På andre språk...                            


6 svar

stemmer
8

Alle dine feil stammer fra det faktum at du feilaktig erklærer arrays inni struct. Du angi størrelsen på tabellen; du kan ikke bare bruke tomme parentes. Dvs dette ville fungere:

typedef struct {
    Field *fields[3];
    Prompt *prompts[3];
    unsigned numFlds;
} Form;

Hvis du trenger å tillate varierende antall elementer, må du bruke noe annet. For eksempel kan du ha begge feltene være pekere:

Field **fields;
Prompt **prompts;

Men da må du dynamisk allokere og ledig minne for dem, og du definitivt ikke vil være i stand til å bruke de samlede initializer å initialisere struct.

Svarte 15/07/2009 kl. 06:59
kilden bruker

stemmer
4

Du har erklært arrays i structdefinisjonen uten å spesifisere grensene. Dette er ikke mulig:

typedef struct {
    Field   *fields[];
    Prompt  *prompts[];
    unsigned numFlds; 
} Form;

Du bør enten angi et tall i parentes eller endre den til en pekertypen i stedet: Field **fields;. Alltid oppmerksom på at størrelsen på en struktur er statisk og er kjent ved kompilering, og dermed kan det ikke ha variabel størrelse rekke inne i seg selv. Det kan imidlertid vise til en variabel størrelse array (som pekere har en konstant størrelse).

Svarte 15/07/2009 kl. 06:58
kilden bruker

stemmer
2

En struktur normalt ikke kan holde et medlem med ufullstendig type (f.eks arrays uten dimensjoner) fordi kompilatoren ikke kan vite at medlem størrelse, dvs. forskyvningen av følgende medlemmer i strukturen ville være ubestemt. Et unntak fra denne regelen er den siste del, som kan ha ufullstendig matrise type (en såkalt fleksibel matrise medlem ).

Løsningen: Bruk fast størrelse matriser eller pekere.

Svarte 15/07/2009 kl. 07:06
kilden bruker

stemmer
0

Det ser ut som en lenket liste struktur kan være mest hensiktsmessig å dine behov.

Forresten - er instruksjonene og mark alltid kartlagt en-til-en? I så fall kan du bare lagre dem i samme struktur.

Svarte 15/07/2009 kl. 07:26
kilden bruker

stemmer
0

Problemet er at du ikke kan initialisere et null lengde array.

hvis du chague den For erklæring til:

typedef struct {
    Field   *fields[100];    
    Prompt  *prompts[100];    
    unsigned numFlds;  // <<< invalid field declaration after empty field
} Form;                    // <<< in '(incomplete) struct (no name)'.

Det vil fungere.

Svarte 15/07/2009 kl. 07:05
kilden bruker

stemmer
0

Den følgende kode [nettopp modifisert og innført størrelsen av matrisen] og kompileres de fine.

#include <stdio.h>

typedef struct {
  char    *fldName;
  unsigned fldLen;
} Field;

typedef struct {
  char    *fldPrompt;
  unsigned startRow;
  unsigned startCol;
} Prompt;

typedef struct {
  Field   *fields[3];
  Prompt  *prompts[3];
  unsigned numFlds;  // invalid field declaration after empty field 
} Form;                    // in '(incomplete) struct (no name)'.

Field  firstName = { "fName", 12 };
Field  surName   = { "sName", 25 };
Field  gender    = { "gder", 1 };

Prompt fn        = { "First Name : ", 4, 10 };
Prompt sn        = { "Surname    : ", 6, 10 };
Prompt gn        = { "Gender     : ", 8, 10 };

int main (void)
{
  Form aForm = { { &firstName, &surName, &gender },
                 { &fn, &sn, &gn}, 
                 3 };   // Multiple initializers for the same element
  return 0;             //  Too many initializers
}

Også, hvis du ønsker mer enn 3 i linje 15, så du trenger å erklære det dobbelt pekeren og allokere minne og bruke det. Men sørg for å allokere / fri det, når det ikke kommer til å bruke den. Ellers vil det føre til minnelekkasje.

Svarte 15/07/2009 kl. 07:03
kilden bruker

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