C hardt koding en rekke typedef struct

stemmer
3

Dette er et dumt spørsmål det er frustrerende selv ber den. Vær så snill, bære over med meg, jeg føler spesielt dum over dette i dag ....

Jeg har et bibliotek med en viss typedef struct. i utgangspunktet:

typedef struct {int x; int y;} coords;

Hva jeg virkelig ønsket å gjøre var å erklære min header en variabel rekke dette:

coords MyCoords[];

(Jeg har nylig byttet det bare coords *MyCoords;og deretter kjørte en MyCoords = new coords[4];)

og deretter i min init ønsket jeg å hardcode noen verdier i det.

MyCoords[] = {{0, 0}, {2, 2} etc. 

Jeg må bare være brainfarting i dag fordi det ikke la meg gjøre noen som helst måte for bare å sette i selv noe enkelt som MyCoords[0] = {0, 0}

beklager om noen av syntaksen ovenfor. Takk for hjelp. Jeg vet ikke engang bryr seg om hardkode alle verdiene på en gang. Jeg er nå fint med bare geting MyCoords[0] = {0, 0}arbeider. Jeg kunne gjøre MyCoords[0].x = 0; MyCoords[0].y = 0, men da ville jeg aldri finne ut hva jeg gjør galt. Tusen takk alle ..

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


4 svar

stemmer
9

Du kan bare initial en rekke på samme sted du deklarerer det. Skjemaet som vil fungere er:

coords MyCoords[] = {{0, 0}, {2, 2}};

Hvis du trenger å erklære MyCoords i en overskrift slik at mange moduler kan få tilgang til det, tror jeg det følgende vil fungere:

extern coords MyCoords[];
Svarte 21/04/2009 kl. 16:37
kilden bruker

stemmer
5

Vel, hva du har laget er ikke en variabel array. Det er en rekke hvis størrelse er ikke kjent. At matrisen har en ufullstendig typen, og kan således ikke defineres i C ++. Det du kan gjøre er å gjøre det bare en erklæring ved å sette externfør det.

extern coords MyCoords[];

Så, i CPP-fil som initialiserer den, kan du deretter opprette (definere) som array - pass bør du gjøre det på navne omfang, utenfor noen funksjon, selvfølgelig:

coords MyCoords[] = {{1, 2}, {3, 4}, ... };

Hvis det du ønsker er en matrise hvis størrelse er ikke kjent ved kompilering ennå, men heller under kjøring, bør du bruke en std::vector:

std::vector< coords > MyCoords;

Senere hvis du fyller den, gjør

MyCoords.push_back( coords(1, 2) );
MyCoords.push_back( coords(3, 4) );
....

Eller skape en lokal matrise og deretter initialisere vektoren ved bruk av en kopi av elementene i den oppstillingen:

coords c[] = ....;
MyCoords.insert(MyCoords.end(), c, c + sizeof c / sizeof *c);

Vel, i C, er det litt annerledes enn i C ++. Du kan definere en matrise som dimensjon er ikke kjent. Det som skjer er at det er tatt for å være en "foreløpig" definisjon. Dersom det på slutten av filen (mer presist, av sin oversettelse enhet, som er den filen, og alle filene den inneholder - noe som betyr alt kompilatoren overs sammen) er det ikke en påfølgende definisjon av det som inkluderer størrelse, deretter størrelse blir tatt for å være 1. Men i C ++ er det ingen tentative definisjoner, og en definisjon som ikke inkluderer størrelse og ikke inneholder en initializer som kan fortelle størrelsen er en ugyldig C ++ program.

For grunnen til at koden går grazy, gjør du

MyCoords[0] = {0, 0}

Hvilke kompilatoren vil lese som:

-> Set LHS to RHS
-> -> LHS is a variable of type `coords`. Fine
-> -> RHS is... hmm, `{0, 0}`. What the heck is it??

Du skjønner, kompilatoren har ingen anelse hva høyre side er ment å bety. C99, av den grunn (1999-versjon av C) introduserte såkalte sammensatte litteraler. Den lar deg skrive

MyCoords[0] = (coords){0, 0};

Og det vil faktisk gjøre hva du vil den skal gjøre - å skape en høyre verdi av typen coordog tildeler den til venstre side. Men du bør bare, allerede fra en kompatibilitets grunn (mange C-kompilatorer er ikke rimelig C99-kompatibel - og verken C ++ eller C89 støtter sammensatte litteraler), kan du bruke en av de tidligere måter jeg viste deg.

Svarte 21/04/2009 kl. 16:43
kilden bruker

stemmer
2

Jeg er ikke sikker på om dette er også et problem i selve koden, men:

typedef struct coords {int x, int y};

er ikke en komplett typedef erklæring i C, som det ikke gi et navn til den typen , bare til struct (struct kodene er ikke i samme navnerom som typenavn i standard C). For å gjøre typedef erklæringen riktig, må du angi et navn for hele typen struct coords {int x, int y}, som om du skulle erklære en variabel av denne typen, som så:

typedef struct coords {int x, int y} coords;
Svarte 21/04/2009 kl. 16:48
kilden bruker

stemmer
0

Det bør være:

typedef struct coords {int x, int y} coords;
coords MyCoords[] = {{0, 0}, {2, 2}, {3, 4}};
Svarte 21/04/2009 kl. 17:13
kilden bruker

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