Probleme wegen Stack Overflow
-
Hallo,
ich möchte gerne das folgende kleine Programm laufen lassen:
long int langesArray[719401]; for (int i=0; i<719400; i++) langesArray[i]=i;
Leider bekomme ich folgende Fehlermeldung:
"Unhandled exception at 0x00404215 in test.exe: 0xC00000FD: Stack overflow."
Der Fehler tritt anscheinend in einer Datei namens chkstk.asm auf.Kann mir jemand weiterhelfen und mir sagen, was ich falsch mache?
Liebe Grüße.
-
Dein lokaler Stack auf dem die Array-Variable abgelegt wird läuft über.
Die Grösse kan über die "Projekt"-Einstellungen deines Compilers geändert
werden.
Oder, du allokierst den Speicher dynamisch vom Heap, mittels new.
-
Stack-Probleme: http://www.kharchi.de/cppratgeber1.htm#vor_und_nachteile
Beste Alternative:
#include <vector> #include <iostream> void test() { std::vector<int> langesArray; langesArray.reserve(719401); for(int i=0; i<719401; i++) langesArray[i]; for(int i=0; i<719401; i++) std::cout << langesArray[i] << std::endl; }
C-Arrays sind böse! Immer vector benutzen!
Hinweise zu vector: http://www.kharchi.de/cppratgeber2.htm
-
Ja, vielen Dank!
Ich habe zwar immer noch keine Ahnung von Vectoren, aber es funktioniert!
-
Artchi schrieb:
Stack-Probleme: http://www.kharchi.de/cppratgeber1.htm#vor_und_nachteile
Beste Alternative:
#include <vector> #include <iostream> void test() { std::vector<int> langesArray; langesArray.reserve(719401); for(int i=0; i<719401; i++) langesArray[i]; for(int i=0; i<719401; i++) std::cout << langesArray[i] << std::endl; }
C-Arrays sind böse! Immer vector benutzen!
Hinweise zu vector: http://www.kharchi.de/cppratgeber2.htm
Diese Benutzung von vector ist fehlerhaft, da reserve() den Speicher reserviert, aber noch lange nicht benutzbar macht. Deshalb sollte man den vector erst füllen, bevor man ihn ausliest:
#include <vector> #include <iostream> void test() { std::vector<int> langesArray; langesArray.reserve(719401); for(int i=0; i<719401; i++) langesArray.push_back(i); for(int i=0; i<719401; i++) langesArray[i]; for(int i=0; i<719401; i++) std::cout << langesArray[i] << std::endl; }
-
dafür gibts doch resize()
-
Vielen Dank soweit!
Aber gibt es auch 2-dimensionale Vectoren?
-
vector<vector<Foo> >
Leerzeichen zwischen den > sind wichtig
-
Helium schrieb:
vector<vector<Foo> >
Leerzeichen zwischen den > sind wichtig
Das ist schon ein wenig mehr als ein zweidimensionaler vector, denn die zweite Dimension muss nicht überall gleich sein.
-
OK. Und wie sage ich dann, dass der Vektor 1500 Zeilen und 9 Spalten haben soll, die jeweils mit int-Werten gefüllt werden sollen? Und sie schreibe ich dann die int-Werte da rein?
-
Hier kann wie immer die Boost Library helfen: