mehrdimensionale statische Felder
-
Hi,
ich brauch im meinem Programm ein mehrdimensionales Feld, das seinen Wert nicht zwischen Funktionsaufrufen verliert. Ich habe es mitstatic BYTE byZustSteine[ANZSPALTEN][MAXSTEINE];probiert, aber das funktioniert nicht.
Gruß,
Held
-
wo hast du das hingeschrieben? ANZSPALTEN MAXSTEINE sind konstanten?
-
Sorry, war vielleicht ein bisschen kurz. ANZSPALTEN und MAXSTEINE hab ich als Makros definiert.
Die Deklaration befindet sich in der Callback Procedure für diverse Childfenster.
LRESULT CALLBACK SpalteWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ ... static BYTE byZustSteine[ANZSPALTEN][MAXSTEINE]; ... }
-
"funktioniert nicht" ist keine ausreichende Fehlerbeschreibung. Kriegst du eine Fehlermeldung? Wenn ja, wie lautet diese? Außerdem wäre es mal schön deine Markodefinitionen zu sehen. Ich würde dir allerdings sowieso in C++ zu Konstanten raten:
unsigned int const ANZSPALTEN = ...; unsigned int const MAXSTEINE = ...;Greetz
-
Hallo
gern gemachter Fehler:
Semikolon hinter der define Anweisung. Benutze lieber const-Variablen (was für eine Wort)
chrische
-
Neuer Versuch:
#define MAXSTEINE 6 #define ANZSPALTEN 7Ich kann das Programm fehlerlos kompilieren (GNU GCC Compiler), abgesehen von ein paar Warnungen, die auf nicht verwendete Parameter hinweisen. Wenn ich das Feld ausgebe
for(int i=0;i<ANZSPALTEN;i++) { cout << endl; for(int j=0;j<MAXSTEINE;j++) { cout << (int)byZustSteine[i][j]; } }sind nach jedem Funktionsaufruf (Mausklick) die alten Werte weg und es wir nur der neue ausgegeben.
Allerdings ist mir auch gerade der Fehler aufgefallen. Ich wollte nach dem deklarieren das Feld mit Nullen füllen, hab aber dummerweise dadurch immer wieder alles mit Nullen überschrieben. Schon dumm wenn man dumm ist.
Das führt auch gleich zu meiner nächsten Frage, gibt es eine Möglichkeit das Feld beim ersten Aufruf zu füllen und dann die neuen Werte nicht mehr zu überschreiben. Ich habs bisher so gemacht
for(int i=0;i<ANZSPALTEN;i++) { for(int j=0;j<MAXSTEINE;j++) { byZustSteine[i][j]=0; } }was aber offensichtlich nicht Funktioniert hat.
Held
-
static-Werte werden normal beim ersten Mal angelegt und initialisiert, wenn das Programm über ihre Definition drüberläuft. Deine Initialisierungsschleife wird aber bei jedem Funktionsaufruf abgearbeitet - und setzt das Array wieder auf Anfang zurück. In deinem Fall ist die Lösung fast schon trivial - nimm eine Initialisierungsliste
static BYTE byZustSteine[ANZSPALTEN][MAXSTEINE]={{0}};. Wenn die Erstbelegung des Feldes etwas aufwendiger ist, hilft folgendes:static BYTE byZustSteine[ANZSPALTEN][MAXSTEINE]; static bool isready=false; if(!isready) { //fülle dein Array isready=true; }
-
Danke,
es ist schön, wenn es auch einfache Lösungen gibt.Held
-
Held vom Erdbeerfeld schrieb:
Neuer Versuch:
#define MAXSTEINE 6 #define ANZSPALTEN 7versuch fehlgeschlagen, bitte noch einmal.
-
Sorry, aber das versteh ich jetzt nicht so ganz. Das Programm lässt sich fehlerfrei kompilieren und macht das was ich will.
Wenn du Verbesserungsvorschläge hast: Ich lerne gerne dazu.
Wenn du meinst, dass das keine const-Variablen sind: das ist mir durchaus bewusst und ich werde das bei Gelegenheit ausbessern.Held