größe von unsigned short array
-
Hallo zusammen,
ich habe ein Array
struct ObjArray { unsigned short pixel[60][60][60]; };das initialisiert wird
for(int i=0;i<60;i++) { for(int j=0;j<60;j++) { for(int k=0;k<60;k++) { m_oArray.pixel[i][j][k] = 255; } } }wenn ich aber einen wert in der Deklaration größer als 60 mache, dann bekomme ich einen stack-overflow gemeldet
wie kann das sein, das ist doch garnicht so groß und wie könnte ich das beheben??
gruß sammy
-
sammynammy schrieb:
wenn ich aber einen wert in der Deklaration größer als 60 mache, dann bekomme ich einen stack-overflow gemeldet
Der Stack ist von der Größe her begrenzt...
sammynammy schrieb:
wie kann das sein, das ist doch garnicht so groß und wie könnte ich das beheben??
...und 216000 short-Werte finde ich nun nicht wirklich klein.
Zum Beheben gibt es 2 Möglichkeiten:
a) Das Array dynamisch allozieren
b) Schauen ob du die Stackgröße in deinen Compiler anpassen kannstBesser wäre es imho ohnehin auf einen Container aus der Standardbibliothek zu wechseln.
cu André
-
ja stimmt; hab da etwas gesagt ohne zu rechnen, ist schon viel!!
und was würdest du so aus der Standartlib vorschlagen?? hab da noch nicht so oft mit gearbeitet...!!
und wie kann ich da etwas dynamisch machen, ich dachte immer, dass die größe von arrays beim erzeugen festgelegt werden müssen.
-
sammynammy schrieb:
ja stimmt; hab da etwas gesagt ohne zu rechnen, ist schon viel!!
und was würdest du so aus der Standartlib vorschlagen??...
Der Klassiker ist std::vector.
Dem kann man beim "Start" (also bei der Deklaration) gleich eine Anfangsgröße mitgeben (muss mn aber nicht) ... die man aber jederzeit beliebig verändern kann.Gruß,
Simon2.
-
std::vector kenne ich schon, geht das denn auch dreidimensional??ich meine nämlich nicht
-
vector<vector<vector<unsigned short> > > DreiDVector(60, vector<vector<unsigned short> >(60, vector<unsigned short>(60)));
-
Du kannst ihn verschachteln:
std::vector<std::vector<std::vector<Type> > > MyVector;Die Frage ist, ob sich das lohnt, und eine Dimension (man kann auch 3 auf eine projizieren) nicht auch reichen würde. Das wird z.B. beim Füllen oder beim Durchiterieren ziemlich mühsam, da immer 3 For-Schleifen nötig sind. Trotzdem immer noch besser als ein rohes Array. Ansonsten bietet Boost auch noch Container an (
boost::multiarray).Man sollte auch daran denken, dass im Worst Case gerade mal 12.5% des Speicherplatzes benötigt werden, die ein dreidimensionaler
std::vectorallokiert (und bis zu seiner Zerstörung nicht mehr freigibt).