Fehler bei Initialisierung von Array mit A[2] = {1, 2};
-
Ich habe ein Array der Form
static const long Ntbl[21] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576};Das liefert mir jedoch den Fehler
FastFourierTrans.cpp(7) : error C2059: Syntaxfehler: '{'
1>.\FastFourierTrans.cpp(7) : error C2143: Syntaxfehler: Es fehlt ';' vor '{'
1>.\FastFourierTrans.cpp(7) : error C2143: Syntaxfehler: Es fehlt ';' vor '}'Was ist daran falsch?
Wenn ich das gleich nicht innerhalb der Klasse schreibe, dann tritt der Fehler nicht auf.
Matthias
-
pospiech schrieb:
Wenn ich das gleich nicht innerhalb der Klasse schreibe, dann tritt der Fehler nicht auf.
Genau das dürfte der Fehler sein - in der Klassendefinition kannst du nur einige elementare Datentypen direkt initialisieren. Alles andere mußt du bei der Definition (für statische Member) bzw. im Ctor füllen:
//test.h class test { static const int vals[2]; ... }; //test.cpp const int test::vals[2] = {1,2};
-
CStoll war schneller als ich aber hier hast du ein link (Anmerkung erster Treffer bei google bei der Suche nach static und c++)
-
EDIT: Oha nur 3. ! Ich sollte auf das "Gegenchecken mit eigenem Compiler" vielleicht doch verzichten
- habe aber mal das "Eigene" stehengelassen:
...Innerhalb einer Klasse kannst Du kein static const Array initialisieren; das geht lt. Standard nur mit "einfachen Typen" (int, char, double, ...);
Hintergrund: Solche Objekte haben keine Adresse, sondern sind Konstanten, die schon zur Compilezeit aufgelöst werden (sie existieren also zur Laufzeit gar nicht mehr).Ein Array hingegen braucht IMMER Speicher => geht also nicht.
Gruß,
Simon2.
-
CStoll schrieb:
//test.h class test { static const int vals[2]; ... }; //test.cpp const int test::vals[2] = {1,2};Das hat kompiliert, solange ich die Klasse nicht verwendet habe.
1>LightModulator2D.obj : error LNK2005: "public: static long const * const FastFourierTrans::Ntbl" (?Ntbl@FastFourierTrans@@2QBJB) ist bereits in AdaptiveAlgorithm.obj definiert.
1>LightModulator2D.obj : error LNK2005: "public: static unsigned char const * const FastFourierTrans::BRcnt" (?BRcnt@FastFourierTrans@@2QBEB) ist bereits in AdaptiveAlgorithm.obj definiert.Danach habe ich versucht es ganz normal zu initialisieren, also
class test { long vals[2]; ... }; test::test(void) { vals[2] = {1,2}; }Das ergibt bei mir den Fehler:
1>.\FastFourierTrans.cpp(7) : error C2059: Syntaxfehler: '{'
1>.\FastFourierTrans.cpp(7) : error C2143: Syntaxfehler: Es fehlt ';' vor '{'
1>.\FastFourierTrans.cpp(7) : error C2143: Syntaxfehler: Es fehlt ';' vor '}'Ich verstehe zwar inzwischen warum ein static problematisch ist, aber nicht warum ein const oder ein normales Array sich nicht definieren lässt.
Matthias
-
Hi,
pospiech schrieb:
...
Das hat kompiliert, solange ich die Klasse nicht verwendet habe.1>LightModulator2D.obj : error LNK2005: "public: static long const * const FastFourierTrans::Ntbl" (?Ntbl@FastFourierTrans@@2QBJB) ist bereits in AdaptiveAlgorithm.obj definiert.
1>LightModulator2D.obj : error LNK2005: "public: static unsigned char const * const FastFourierTrans::BRcnt" (?BRcnt@FastFourierTrans@@2QBEB) ist bereits in AdaptiveAlgorithm.obj definiert.Linkerfehler, weil jedes Objekt nur einmal im gesamten Programm definiert sein darf; sprich: es darf nur eines geben.
Sieht so aus, als hättest Du CStolls "test.cpp" überlesen.
Das ist hier aber wichtig:CStoll schrieb:
//test.h class test { static const int vals[2]; // Simon2: Deklaration (="So ist vals aufgebaut") ... }; //test.cpp const int test::vals[2] = {1,2}; // Simon2: Definition (="Das IST vals") + Initialisierung (="... und das soll drinstehen")Die Definition sollte deswegen nicht im Header stehen, weil sie dann eigentlich immer per #include in verschiedene Module kopiert wird ... und der Linker sieht dann jedes Einzelne, wo er aber nur eines braucht / haben will/darf.
Stattdessen schreibt man das dann in "das cpp-File", das nicht mehr irgendwo #included wird.pospiech schrieb:
...
Danach habe ich versucht es ganz normal zu initialisieren, alsoclass test { long vals[2]; ... }; test::test(void) { vals[2] = {1,2}; }Das ist eben keine Intialisierung (sprich: Bei der Erzeugung gesetzte Werte), sondern eine Zuweisung (sprich: Bereits erzeugtem Element werden Werte zugewiesen).
Lösung: Einzeln zuweisen:test::test(void) { vals[0] = 1; vals[1] = 2; }Letztlich brauchst Du das aber nicht, wenn Du Obiges ("in .cpp") machst.
Gruß,
Simon2.
-
Simon2 schrieb:
Lösung: Einzeln zuweisen:
test::test(void) { vals[0] = 1; vals[1] = 2; }Äh, mein Array hat 256 Einträge... und damit keine schöne Lösung.
Ich habe es jetzt in die Funktionen die es benötigen ohne ein const reingeschrieben.Matthias
-
pospiech schrieb:
...
Äh, mein Array hat 256 Einträge... und damit keine schöne Lösung.
Ich habe es jetzt in die Funktionen die es benötigen ohne ein const reingeschrieben.Matthias
Wie gesagt: Brauchst Du gar nicht ! Schreib Deine Definition und Initialisierung in ein .cpp und schon funktioniert alles und const ist es auch !
Gruß,
Simon2.
-
Simon2 schrieb:
Wie gesagt: Brauchst Du gar nicht ! Schreib Deine Definition und Initialisierung in ein .cpp und schon funktioniert alles und const ist es auch !
Ja, nur das es in einer anderen cpp Datei aus der ich das alles entnommen habe schon definiert ist. Daher wollte ich den Gültigkeitsbereich auf die Klasse einschränken, damit es noch immer definiert ist wenn ich die andere cpp Datei losgeworden bin.
Ist am Ende auch egal. Ich weiß jetzt was geht und was nicht.
Matthias