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 cs10
    

    Versteht 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


Anmelden zum Antworten