Speicherzugriffsfehler beim Versuch, ein Array von Klassenobjekten anzulegen
-
Hi(gh)!
Hier nochmal meine Definiton von Vec:
class Vec { private: double x; double y; double z; public: void set (double a, double b, double c); void print(); double getx(); double gety(); double getz(); friend Vec vcross(Vec v1, Vec v2); friend Vec vsubtract(Vec v1, Vec v2); friend Vec normal_vector(Vec v1, Vec v2, Vec v3); friend double vlength(Vec v); friend Vec vdivide(Vec v, double d); friend Vec vnormalize(Vec v); }; void Vec::set (double a, double b, double c) { x = a; y = b; z = c; } void Vec::print() { cout << "<" << x << ", " << y << ", " << z << ">"; } double Vec::getx() { return x; } double Vec::gety() { return y; } double Vec::getz() { return z; }
Warum führt dann im Hauptprogramm
Vec V_vec_Arr[12967201];
zu einem Speicherzugriffsfehler? So gigantisch groß ist doch das einzelne Vec-Objekt nicht... muss ich eventuell das Array stattdessen als dynamisches vector-Objekt (also vector<Vec>) aufbauen?
Bis bald im Khyberspace!
Yadgar
-
@Yadgar sagte in Speicherzugriffsfehler beim Versuch, ein Array von Klassenobjekten anzulegen:
12967201
In Summe sind das wahrscheinlich 297 MiB. Dein Stack ist kleiner.
-
@Swordfish sagte in Speicherzugriffsfehler beim Versuch, ein Array von Klassenobjekten anzulegen:
In Summe sind das wahrscheinlich 297 MiB. Dein Stack ist kleiner.
Wie vergrößere ich den Stack?
-
@Yadgar sagte in Speicherzugriffsfehler beim Versuch, ein Array von Klassenobjekten anzulegen:
@Swordfish sagte in Speicherzugriffsfehler beim Versuch, ein Array von Klassenobjekten anzulegen:
In Summe sind das wahrscheinlich 297 MiB. Dein Stack ist kleiner.
Wie vergrößere ich den Stack?
Gar nicht. Benutze std::vector.
-
@manni66 sagte in Speicherzugriffsfehler beim Versuch, ein Array von Klassenobjekten anzulegen:
Gar nicht. Benutze std::vector.
Das habe ich dann auch gemacht:
int main() { ifstream ASCII_Matrix; unsigned int i=0; int wert; vector<Vec> V_vec_Arr; Vec vektor; const double pi = 3.14159265359; const int rd = 6378140; const int dim = 3601; const int vertices = dim * dim; double longstart = 68; double latstart = 34; ASCII_Matrix.open("Rohdaten/n34e068.txt"); while (ASCII_Matrix >> wert) { vektor.set((rd+wert)*sin((-longstart-(double)(i%dim)/dim)*(pi/180))*cos((latstart-(double)(i/dim)/dim)*(pi/180)), (rd+wert)*sin((latstart-(double)(i/dim)/dim)*(pi/180)), (rd+wert)*cos((-longstart-(double)(i%dim)/dim)*(pi/180))*cos((latstart-(double)(i/dim)/dim)*(pi/180))); V_vec_Arr.push_back(vektor); } V_vec_Arr[0].print();
...bekomme aber bei der Testausgabe des ersten Elements wieder einen Speicherzugriffsfehler! Warum?
-
@Yadgar
Du prüfst nicht, ob ein Element vorhanden ist.Du prüfst nicht, ob die Datei geöffnet wurde.
Du prüfst nicht, ob ein Wert gelesen werden konnte.
-
@manni66 sagte in Speicherzugriffsfehler beim Versuch, ein Array von Klassenobjekten anzulegen:
@Yadgar
Du prüfst nicht, ob ein Element vorhanden ist.Du prüfst nicht, ob die Datei geöffnet wurde.
Du prüfst nicht, ob ein Wert gelesen werden konnte.
Ich habe den Fehler gefunden: die Datei konnte nicht geöffnet werden, weil ich sie über einen relativen Pfad angesprochen hatte. Jetzt verwende ich den absoluten Pfad und voilà, es funktioniert! Danke für den Hinweis! Und auch nach dir wird eine Straße im POVghanischen Kabul benannt werden...
Bis bald im Khyberspace!
Yadgar