max. Größe eines struct Arrays?
-
Hallo zusammen,
ich habe eine kurze grundsätzliche Frage zu Arrays über eine Struct.
Ich habe mehrere structs vorliegen und kann diese je nach Größe nur unterschiedlich deklarieren.
Bspw. kann ich über folgende struct
struct datensatz_duwa { string daten; string strasse; string nummer; int semikolon[16]; };genau 20000 Array-Elemente bilden, bevor mir mein Programm abstürzt.
Über folgende Struct
struct datensatz_ewo { string daten; string strasse; string schluessel; string nummer; string gliederung; };kann ich ca. 25000 Array Elemente bilden, bevor mir mein Programm abstürzt.
Wovon hängt die Größe eines Arrays über einer Struct ab?
Für mein nächstes Projekt bräuchte ich bspw. eine struct der folgenden Form
struct datensatz_neu { string daten; int alter; };mit ca. 150000 Elementen.
Ich hoffe Ihr könnt' mir da vielleicht erklären, wovon die Größe eines Feldes abhängt.
Besten Dank...
cya
-
Ab wann dein Programm nicht mehr kompilierbar ist, hängt von der Stackgröße ab. Wie Du diese ggf. verändern kannst entnimmst du der Dokumentation der Toolchain Deines Vertrauens.
greetz, Swordfish
-
frauen.versteher schrieb:
Ich hoffe Ihr könnt' mir da vielleicht erklären, wovon die Größe eines Feldes abhängt.
Ja.
Die Größe eines struct-Feldes hängt davon ab, welche Datentypen in diesem Feld enthalten sind.
Jeder Datentyp hat da so seine eigene Größe, die dann auch noch abhängig vom Compiler sein kann.struct struct_1 { string str; }; struct struct_2 { char *pc; };struct_1 ist hier z.B. viermal größer als struct_2.
Gruß,
p.
-
Cool, danke Dir, dann werde ich es mal mit char* probieren...
cya
-
Mach's lieber nicht - selbst wenn char* ein wenig kleiner ist als string, gibst du damit den ganzen Komfort der C++ Stringverarbeitung auf. Und glaub mir, die Arbeit mit blanken char-Pointern kann haarig werden.
Wenn du tatsächlich so große Arrays brauchst, daß du damit den Stack überlastest, solltest du lieber auf den Heap ausweichen
Das heißt, du definierst dir einen vector<datensatz...> anstelle des Arrays (der kann theoretisch so groß werden, wie dein RAM es zulässt - und er kann im Lauf des Programms stückweise vergrößert werden).
-
Das heißt, du definierst dir einen vector<datensatz...> anstelle des Arrays
ACK
-
hustbaer schrieb:
Das heißt, du definierst dir einen vector<datensatz...> anstelle des Arrays
ACK
ACK
-
ja ich bin auch die ganze Woche über char* gestolpert und ohne die schönen String-Methoden komme ich da einfach nicht weiter...
Aber das mit dem Vector werde ich mir mal anschauen...
nochmals Danke...
cya
-
CStoll schrieb:
Mach's lieber nicht - selbst wenn char* ein wenig kleiner ist als string, gibst du damit den ganzen Komfort der C++ Stringverarbeitung auf. Und glaub mir, die Arbeit mit blanken char-Pointern kann haarig werden.
Ich komme ja aus der C-Welt und kenne nur char pointer
aber geht denn nicht auch folgendes?Pointer vom Typ String und malloc einer Stringvariable?
Also z.B. sowas
String *p; p = (String *)malloc(sizeof(String));Sollte doch auch funktionieren oder?
Greetz
-
Nein, es geht nicht - und obendrein ist es (sorry) schwachsinnig. Erstens ist die string-Klasse kompakt genug, um direkt gespeichert zu werden und zweitens solltest du keine C++ Klassen per malloc() anfordern (der von malloc() gelieferte Speicherbereich ist in 99% der Fälle nicht richtig initialisiert, um als Objekt verwendet werden zu können).
-
CStoll schrieb:
Nein, es geht nicht - und obendrein ist es (sorry) schwachsinnig. Erstens ist die string-Klasse kompakt genug, um direkt gespeichert zu werden und zweitens solltest du keine C++ Klassen per malloc() anfordern (der von malloc() gelieferte Speicherbereich ist in 99% der Fälle nicht richtig initialisiert, um als Objekt verwendet werden zu können).
Achso ich dachte es ist nur ein Datentyp und keine Klasse

naja wie gesagt habe mit C++ nicht viel am Hut... dann musses wohl anders gehen...