struct Problem?
-
Hallo.
Ich habe ein grösseres strukt mit 10.500 Indexen.
definiert ist das so:
P
CBuilder Programm:struct daten { unsigned short zahl; AnsiString name; unsigned char status; unsigned char nummer; // und viele AnsiString's mehr }; struct code { daten[3]; }MyStruct[3500]; MyStruct[1000].daten[0].name = "huhu";
Ich fülle das Struct erstmal mit Leerwerten, damit kein Unsinn drinsteht.
Das einlesen der Datenbank in das struct läuft auch problemlos, will ich aber das Programm beenden, erhalte ich ein "Klasse EAccessViolation" Messagebox.
Wenn ich ein beliebiges AnsiString aus der struct statt mit dem echten Inhalt mit "x" fülle, kommt der Error nicht mehr.Ich denke darum das das struct zu gross geworden ist?
Was wäre jetzt die korrekte Lösung für das Problem?
Hilfe wäre wirklich hilfreich
-
munk schrieb:
Hallo.
Ich habe ein grösseres strukt mit 10.500 Indexen.
definiert ist das so:CBuilder Programm:
struct daten { unsigned short zahl; AnsiString name; unsigned char status; unsigned char nummer; // und viele AnsiString's mehr };
Ich sehe aber nur 4 Komponenten (nicht Indexen)
Oder bedeutet
// und viele AnsiString's mehr
etwa daß dein struct aus 10.496 weiteren Komponenten besteht?
Im übrigen: http://www.deppenapostroph.de/
-
struct code { daten[3]; }MyStruct[3500];
@Javaner
3 * 3'500 = 10'500
-
munk schrieb:
Ich habe ein grösseres strukt mit 10.500 Indexen.
-
Schade, habe richtige Antworten und Tipps/Hilfe erwartet und nicht soetwas.
-
Dann poste dein Problem auch richtig.
Ich denke darum das das struct zu gross geworden ist?
Daran kann's nicht liegen! Dein struct code enthält nur
ein Element und dein struct daten sicher auch nicht allzuviele
(Wir wissen allerdings immer noch nicht vieviele // und viele AnsiString's mehr sind).Ansonsten ist es ohne Codé praktisch unmöglich zu sagen, wo der Fehler liegt.
Versuch doch mal den Fehler einzukreisen! Nicht indem du ein paar x'en
in dein AnsiString schreibst, sondern den Code soweit kürzst bis der Fehler
verschwindet.
-
munk schrieb:
Schade, habe richtige Antworten und Tipps/Hilfe erwartet und nicht soetwas.
Korrekt, ich hatte das mit den 10500 "Elementen" schon richtig kapiert
... andere Frage: Wie besorgst Du Dir den Speicherplatz für die AnsiStrings? Doch hoffentlich nicht mit malloc(). In diesem Fall wäre der Fehler erklärbar
Anderenfalls wäre ein Stück Code doch sehr hilfreich...
P.S.: Gehört das Thema nicht eigentlich in die Rubrik "VCL/CLX (Borland C++ Builder)". Mit Ansi-C hat das jedenfalls nichts zu tun.
-
Speicherplatz besorge ich mir garnicht und das ja meine Frage. Ich lese gut 500KB in dieses struct ein und sogut kenne ich mich nicht aus.. eventuell arbeitet struct auf dem Register und das wird zuviel für ihn?
Muss man das struct eventuell per new "anlegen" (wie sieht das dann für dieses struct aus?) oder habe ich den Fehler nicht im struct zu suchen, sondern dort macht sich nur ein Speicherfehler der irgendwo liegt bemerkbar? Denn wenn ich das anlegen des structs auslagere, dann habe ich keinen Error nur im grossen ganzen Programm kommt es dazu.
Allerdings kam der Fehler auch erst mit dem struct, vorher kam eventuell ein Speicherfehler auch nicht zum tragen?!
Meine Frage ist also nur, ob oder ob nicht ein struct zu gross geraten kann und man es anders anlegen muss. Damit meine ich das Fassungsvermögen eines structs und nicht wie behauptet die "Komponenten"Anzahl.
Wieviele AnsiString oder sonstwas das struct enthält ist da doch wohl absolut nebensächlich.
-
munk schrieb:
Ich lese gut 500KB in dieses struct ein
Wie liest du denn ein?
-
struct code { daten[3]; }MyStruct[3500];
Hast du dies genauso im Programm stehen, dann oh weia!!!
Mit daten[3] legst du ein int Array mit 3 Werten an, welches den Namen 'daten' trägt, d.h. dies entspricht "int daten[3]".
Wie füllst du denn die Daten?
Der Compiler müßte dir dann eigentlich einen Fehler beim Zugriff auf daten liefern. Wenn du die Daten direkt binär einliest (per Read), dann kannst du im "struct daten" nur PODs benutzen (und ein AnsiString ist definitiv kein POD sondern eine Klasse mit einem internen Zeiger).´Am besten du zeigst mal deine Einlese- bzw. Speicherroutine ...
-
Th schrieb:
Mit daten[3] legst du ein int Array mit 3 Werten an, welches den Namen 'daten' trägt, d.h. dies entspricht "int daten[3]".
Stimmt ja!
Da bin ich nicht drüber gestolpert.