13. december 2000 - 22:56Der er
12 kommentarer og 1 løsning
Problemer med at få oprettet et GLOBAL array !!
I min MAIN.CPP fil ( her ligger main() m.v.) inkluderer jeg MAIN.HPP
I MAIN.HPP definerer & initialiserer jeg et globalt array: extern int a[ 8 ] = { 0 };
Derefter har jeg 4 andre .CPP filer der alle behandler data fra arrayet. Jeg får bare fejl lige meget hvad jeg prøver !
FEJL1: Hvis jeg gør som jeg lige har beskrevet får jeg besked om at: \"int * a\" (?a@@3PAHA) already defined in hentsend.obj
FEJL2: Hvis jeg prøver at flytte defineringen til fx. lige før min main() funktion så får jeg besked om at: \'a\' : undeclared identifier
HVAD GØR JEG ??? Kan man fx definere arrayet 1 gang som beskrevet - og så \"forklare\" de ekstra filer at de har bare at forstå at arrayet ALLEREDE eksisteret(selvom de ikke kan se det) - og at de iøvrigt ikke skal blande sig i det?
Jamen det er da også en grundlæggende fejl, at du overhovedet skriver:
extern int a[8] = {}...
extern anvendes (ligesom static) til at erklære linkage typen for en variabel. Hvis du har globale variable - hvilket virkeligt er bad style - sorry - så læg dem evt. på flg. måde:
Global.h: extern int a[8]; extern double b[42]; : : --- Global.cpp: int a[8] = {0,1,2,3,4,5,6,7}; double b[42] = {0.0,1.0,2.0,...}; ---
og de implementations-filer, der har brug for dem kan så inkludere Global.h, så skulle alle problemer være løst. Som sagt er globale variable sjældent god stil, men det kan være nødvendigt. Hvis du vil gøre dig selv en lille tjeneste, og din compiler er nogenlunde up to date, så pak dem i det mindste ind i et namespace:
Global.h: namespace Global { int a[8]; double b[42]; }; --- Global.cpp: int Global::a[8] = {....}; double Global::b[42] = {...};
læg mærke til at extern keywordet ikke er nødvendigt. I din implementering skriver du enten:
impl1.cpp: #include \"Global.h\" void f(void) { int s = Global::a[4]+77; : };
eller
impl2.cpp: #include \"Global.h\" using namespace Global; void f(void) { int s = a[4]+77; // namespace Global implicit. :
};
i det sidste tilfælde anvendes a automatisk fra namespacet Global.
Det gode ved namespaces er, at du nu roligt kan lade dit program vokse lidt i størrelse uden at være frygtelig bange for name-clashes, dvs. at gode fornuftige variabel-navne kan genbruges, og hvis der er tvivl om at det er variablen x fra namespace Global eller SemiGlobal, jamen så resolver du det da bare med at skrive namespacet foran ligesom i eksempel impl1.cpp.
moykal har ret - problemet er at du sætter initiale værdier på SAMMEN med extern. Det kan compileren ikke finde ud af - eller rettere - compileren ignorer extern, hvis du også indtaster initial-værdier. Hermed får du jo initialiseret din tabel alle steder hvor din .h fil er inkluderet.
(Ærgeligt du nåede at svare først moykal - velkommen på eksperten i øvrigt, du er en flittig svarer ser jeg.)
Jep, jeg har i mellemtiden også selv fundet ud af at det er på denne måde til tilsyneladende hænger sammen. Men nu har jeg i hvert fald fået det bekræftet.
Altså: Lige før main() laves en: int a[8]={0};
Lige før alle andre funktioner(kun en gang pr. fil) der skal bruge arrayet laves en: extern int a[];
Jeg bryder mig altså ikke spor om, at du initialiserer et int-array af længde otte med en værdi. Og som sagt - for Søren - du må for din egen skyld se at gå væk fra globale variable. Der er ubegribeligt mange grunde til at C++ og andre sprog indfører noget der hedder objekt-orienteret bla bla bla men den bedste (synes jeg - fordi Alex Stephanov synes det) er STRUKTUR. Og en del af det at have struktur på sit program er, at lægge den data programmet arbejder på et passende sted. Og vil du ikke lægge skidtet inde i et objekt, så tag \"light-weight\" udgaven (og gå glip af konstrukterer/destruktorer og alle de herligheder de byder på ifm. scope etc.) og det er et namespace. Hvis du ikke kender namespace, så tænk på noget i retning af en struct (helt public klasse) hvor ALT er static, dvs. hverken data eller metoder relaterer til nogen instans, hvorfor konstruktorer/destruktorer også mister deres betydning.
Bjarne Stroustrup - den seneste - beskriver forøvrigt namespaces perfekt. Hvis du er C++-begynder, er han dog nok ikke lige den bedste at kaste sig over - men afsnittet om namespaces er perfekt. Overvej ellers at læse:
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.