Was begrenzt die Größe eines Arrays als Membervariable?
-
Hallo allerseits!
Folgendes Phänomen:
Ein großes Array als globale Variable
float g_fwert[2000][2000];bereitet keine Probleme, dasselbe als Membervariable
class egal { ... public: float m_fwert[2000][2000]; ... }führt dazu, dass das Programm beim Ausführen sofort abstürzt mit folgender Meldung:
Unhandled exception at 0x00617457 in programmname.exe: 0xC00000FD: Stack overflow.
Der Debugger zeigt dabei auf Zeile 99 von chkstk.asm:
; Find next lower page and probe cs20: sub eax, _PAGESIZE_ ; decrease by PAGESIZE test dword ptr [eax],eax ; probe page. // <- Das ist Zeile 99 jmp short cs10Versteht das jemand?
Und wie könnte man diese Problem vermeiden / umgehen?Ich jedenfalls kann mir bis jetzt zwei Workarounds vorstellen:
1. Workaround:
Vektor statt 2D-Array.
Vorteil: Programm funktioniert, Größe flexibel
Nachteile:
- Der Vektor der Größe [2000*2000] beanprucht laut Taskmanager aber deutlich mehr RAM als das [2000][2000] Array.
- Mini-Umrechungsfunktion von 2D-Koordinaten nach 1D-Vektor Position nötig. Schluckt bestimmt ein bisschen Zeit....2. Workaround:
Folgendes konnte ich noch nicht ausprobieren, aber mir vorstellen:
[2000][2000] Array als globale Variable und einen Zeiger als Membervariable darauf.
Bloß:
Funktioniert das? und:
Wie greift man per Zeiger auf ein 2D-Array zu? Bei einem 1D-Array ist mir das klar, aber bei einem 2D....?Wie bewertet Ihr die Workarounds? Gibt es sonstige Alternativen (falls ein Workaround überhaupt notwendig ist...)
Danke und Gruß!
-
Stacküberlauf!
Mein Vorschlag Heap-Speicher verwenden z.B.typedef float(*myPtr)[2000]; myPtr g_fwert = new float [2000][2000]; myPtr[1000][80] = 47.11;mfg
-
sorry so ists richtig
typedef float(*myPtr)[2000]; myPtr g_fwert = new float [2000][2000]; g_fwert[1000][80] = 47.11;
-
Danke, damit gibt es zumindest keinen Absturz.
Den Zugriff muss ich noch ausprobieren...
(...das Programm legt allerdings bei der Erstellung dieses Arrays eine ganz schöne Verschnaufpause ein... ;))
-
Super, Zugriff klappt auch!
Danke!!!
Was ich noch nicht so ganz verstehe ist die typedef Zeile.
Mein Verständnis:
Ohne dieses (sondern stattdessen eben nur float als Typ) könnte man nur ein 1-Dimensionales Array mit new erzeugen, stimmt das?Danke und Gruß!
-
Hallo
Nein ein typedef hat keinerlei semantische Auswirkungen, sondern ist nur ein Alias zum Masieren/Vereinfachen von komplexen Typen. Der Compiler ersetzt dann alle typedefs wieder durch die Originale.
bis bald
akari