Grundlegende Frage - "struct" begrenzt ???



  • Hallo NG!

    Ich wollte, um möglichst viele Daten strukturiert abzuspeichern das folgende struct verwenden:

    typedef struct {
    	int x;
    	int y;
    	int info;
    	int dx;
    	int dy;
    	int I;
    } MY_LIST;
    

    In meinem kleinen Mini-Beispiel habe ich in "main" dann folgendes implementiert:

    int _tmain(int argc, _TCHAR* argv[])
    {
             int iNumberOfElementsInside;
    	MY_LIST cornerListTest[iNumberOfElementsInside];
    
             return 0;
    }
    

    Und jetzt kommt das Problem, das ich einfach nicht gelöst kriege ... wähle ich die iNumberOfElementsInside kleiner als 43100 klappt die Initialisierung und später auch das Ansprechen der einzelnen Elemente. Wähle ich iNumberOfElementsInside jedoch größer als 43100 kriege ich zwar keinen Compilerfehler, das Programm stürzt aber trotzdem ab, und zwar HIER (shkstk.asm):

    probepages:
            sub     ecx,_PAGESIZE_          ; yes, move down a page
            sub     eax,_PAGESIZE_          ; adjust request and...
    
            test    dword ptr [ecx],eax     ; ...probe it
    
            cmp     eax,_PAGESIZE_          ; more than one page requested?
            jae     short probepages        ; no
    

    Kann mir jemand sagen, warum dieser Fehler auftritt ??? Ich möchte unbedingt wesentlich mehr als die 43100 Elemente in dem struct speichern, von daher stehe ich nun vor einem ziemlichen Problem, denn das Einführen verketteter Listen macht den eigentlichen Code arg unübersichtlich.

    Jemand einen Tipp ??



  • 1. Weg mit dem typedef, das brauchst du in C++ nicht mehr.
    2. Arrays sind böse, nimm einen std::vector<MY_LIST>, der sollte deine Ansprüchen genügen



  • Ui, du allokierst hier grosse Mengen an Speicher auf dem STACK. Davon ab dass das kaum ein C-Compiler überhaupt kann (Du benutzt den gcc, gell?) ist der Stack vergleichsweise begrenzt...

    Du solltest Dein Array unbedingt auf dem Heap allokieren, dann wirds auch mit mehr Einträgen klappen:

    MY_LIST *cornerListTest = new MY_LIST[iNumberOfElements];
    ....
    delete[] cornerListTest;
    


  • Danke Lord!

    Habs ausprobiert ... GEHT! Klasse! Danke


Anmelden zum Antworten