Absturz bei zu großem Feld



  • sookie schrieb:

    Hier müssten Informationen bezüglich des Problems stehen

    Hmmm ja.



  • die Probleme treten bei einem 2-dimensionalen Byte-Array (unsigned char) ab ca. 11 x 100.000 bis 11 x 200.000 auf bzw. bei 400 x 20.000. also bei einer Gesamtgröße jenseits einer Million Bytes...



  • na ist doch eher die Frage wo du den reservierst, auf dem Stack oder Heap und wie also bissel Quelltesttext könnte da Wunder bewirken.



  • Warum benutzt du keinen dynamischen Speicher?
    Dabei kannst du die gewünschte Größe einstellen und auch prüfen, ob die Speicherreservierung/vergrößerung fehlerfrei ausgeführt werden konnte.



  • es ist einfach ein Arry in einer Klasse:

    class CCSoftware
    {
      // Konstruktion
      public:
    	  CCSoftware() {}									// Standardkonstruktor (keine Parameter)
    
      // Interface
      public:
    
      #define		FELD_LENGTH_LONG 100000
      #define		ANZAHL_FELDER 400
      #define		FELD_LENGTH_SHORT 20480
    
      BYTE			TmpBuffer[ANZAHL_FELDER][FELD_LENGTH_SHORT];
      BYTE			TmpTag[ANZAHL_FELDER];
      unsigned int	TmpLength[ANZAHL_FELDER];
    
      BYTE			BigTmpBuffer[11][FELD_LENGTH_LONG];				// besonders groß
      BYTE			BigTmpTag[11];
      unsigned int	BigTmpLength[11];
    

    eigentlich ganz schlicht...
    Diese Version stürtzt ab. Wenn ich hier FELD_LENGTH_SHORT auf 2048 setze, dann läuft's!!


  • Mod

    So etwas gehört in den Heap und nicht auf den Stack.

    Der Standard Stack hat eine Größe von 1MB!



  • OK - heap/stack?? was muss ich tun? 😕



  • new im Konstruktor
    delete im Destruktor

    wahlweise als 1 Speicherblock oder feldweise.


  • Mod

    sookie schrieb:

    OK - heap/stack?? was muss ich tun? 😕

    Nach dieser Frage lege ich Dir ans Herz zuerst mal ein wenig C++ Tutorials durchzuarbeiten.



  • Wutz schrieb:

    new im Konstruktor
    delete im Destruktor

    wahlweise als 1 Speicherblock oder feldweise.

    Habe jetzt ein Objekt der Klasse mit new im globalen Bereich erzeugt, dann ging's... Danke!



  • sookie schrieb:

    Habe jetzt ein Objekt der Klasse mit new im globalen Bereich erzeugt, dann ging's... Danke!

    und warum erstellst du das komplette Object mit new und warum machst du das dann auch noch global, is irgendwie nicht verständlich, solltest doch mal in paar bücher schaun oder paar tutorials durcharbeiten, was du machst sieht aus wie Copy&Paste - Programierung



  • OK - ich vertseh's auch nicht... kurze Erläuterung: ich programmiere eigentlich C und nicht C++. Manchmal kommme ich aber um die Verwendung einer Klasse nicht herum, dennoch ich bin bisher nicht in die Details der objektorientierten Programmierung eingedrungen. Ein paar Dinge habe ich verstanden, aber noch lange nicht alles.

    Mir ist es wichtig, das der Compiler meine Variablen akzeptiert und weniger warum er das macht. Ich möchte keinen Compiler schreiben. Es ist schon ärgerlich genug, dass das erzeugte Programm sang & klanglos abschmiert und nur korrekt funktioniert, solange die Felder klein genung sind. Diese Probleme sollte der Compiler irgendwie alleine lösen oder wenigstens das Problem erklären und einen Vorschlag machen, wie es zu lösen ist.

    Zum Glück kommen solche Compilerprobleme nur selten vor. Daher halte ich es für verhältnismäßig, jemaden um eine Tip zu bitten, der bestenfalls (wie jetzt hier) das Problem kurz und schmerzlos löst. Meine Lösung ist wahrscheinlich nicht optimal bzw. im Sinne der schönen Programmierung sinnvoll, aber es scheint zu funktionieren und das reicht mir erstmal. Für einen eleganteren Vorschlag bin ich immer offen.

    Villeicht kann man das Objekt auch lokal erzeugen - habe ich noch nicht ausprobiert. Außerdem habe ich festgestellt, der Compiler mit großen globalen Datenfelder weniger Probleme hat, als wenn sie lokal definiert werden (Heap > Stack?)...



  • sookie schrieb:

    ich programmiere eigentlich C und nicht C++. Manchmal kommme ich aber um die Verwendung einer Klasse nicht herum, dennoch ich bin bisher nicht in die Details der objektorientierten Programmierung eingedrungen. Ein paar Dinge habe ich verstanden, aber noch lange nicht alles.

    Was bekommst du denn in C nicht hin, dass du eine Klasse brauchst?

    #define        FELD_LENGTH_LONG 1000000
    #define        ANZAHL_FELDER 400 
    
    class CCSoftware
    {
      BYTE            *BigTmpBuffer[ANZAHL_FELDER]; 
      public:
          CCSoftware() { int i=ANZAHL_FELDER; while( i-- ) BigTmpBuffer[i]=new BYTE[FELD_LENGTH_LONG]; } 
          ~CCSoftware(){ int i=ANZAHL_FELDER; while( i-- ) delete [] BigTmpBuffer[i]; } 
    
    };
    

    Reserviert anstandslos 400 MB, das sollte wohl für dich reichen?!
    Dasgleiche geht in C natürlich auch mit malloc/free, aber für C++ sicher ziemlich unpassend.


  • Mod

    Ich rate Dir nochmal: Lies ein wenig mehr Tutorial? Gerade weil Du selbst sagst Du verstehst es nicht.

    Ob Du C oder C++ programmierst spielt doch keine Geige.
    Auch Dein C Compiler meldet keinen Fehler wenn Du auf dem Heap Elemente > 1MB ablegst.

    Und ja der Heap ist größer als der Stack (i.A.), denn der hat ja wie gesagt im Standard 1MB.

    Woher soll der Compiler bitte wissen wie große der Stack ist? Das ist einzig alleine Sache des laufendne Prozesses.

    Wenn Du C programmiest sollte Dir malloc und Zeiger auch bekannt sein... und lokale Variablen auch.



  • Oh - sieht sehr schön aus!! Vielen herzlichen Dank für die Mühe!! 👍 Ach ja - manchmal wird einfach eine Klasse "zur bessern Kapselung" gewünscht...



  • Martin Richter schrieb:

    Ich rate Dir nochmal: Lies ein wenig mehr Tutorial? Gerade weil Du selbst sagst Du verstehst es nicht.

    OK - etwas mehr zu wissen scheint wohl sinnvoll... 😞

    Ob Du C oder C++ programmierst spielt doch keine Geige.
    Auch Dein C Compiler meldet keinen Fehler wenn Du auf dem Heap Elemente > 1MB ablegst.

    Und ja der Heap ist größer als der Stack (i.A.), denn der hat ja wie gesagt im Standard 1MB.

    Woher soll der Compiler bitte wissen wie große der Stack ist? Das ist einzig alleine Sache des laufendne Prozesses.

    Tja, villeicht sollte dann besser der laufende Proozess den Speicher sortieren... 🤡

    Wenn Du C programmiest sollte Dir malloc und Zeiger auch bekannt sein... und lokale Variablen auch.

    Speicherreservierung ist mir natürlich bekannt - dachte nur dass die modernen Compiler das inzwischen selbst regeln (sollten). 😃 und woher soll man z.B. wissen, ab wann man Speicher reservieren muß und wann man noch eine einfache (Hochsprachen-)Variable nutzen kann? 🙄 Mir erscheint diese ganze Speicherproblematik eher wie ein internes Compiler/Prozess/Betriebssystem-Problem - ich hätte gerne, dass der Compiler/Prozess meine Variablen-Anforderugen selbständig umsetzt, was offensichtlich nicht der Fall ist.


  • Mod

    Nein offensichtlich brauchst Du nur eine neues Keyboard mit einer DWIM-Taste 🤡
    c) Martin Richter


Anmelden zum Antworten