Absturz bei zu großem Feld
-
OK - heap/stack?? was muss ich tun?
-
new im Konstruktor
delete im Destruktorwahlweise als 1 Speicherblock oder feldweise.
-
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 Destruktorwahlweise 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.
-
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.
-
Nein offensichtlich brauchst Du nur eine neues Keyboard mit einer DWIM-Taste
c) Martin Richter