Assertion: BLOCK_TYPE_IS_VALID
-
Ich schreibe gerade eine Lade-/Speicher-Funktion, dass speichern funktioniert fehlerlos, beim Laden werden dann auch die richtigen Dateien angezeigt. Beim beenden des Programms (beim Debuggen also beim return 0 der Main-Funktion bekomme ich eine "Assertion failed" Meldung.
File: dbgheap.c
Line: 1017
Expression: _BLOCK_TYPE_IS_VALID(pHeap->nBlockUse)Der Fehler müsste in der folgenden Funktion zu finden sein, da wenn ich den markierten Teil auskommentiere die Meldung nicht mehr kommt.
int LoadGame(FMDatabase* fmDB) { fstream file("test.txt",ios::in|ios::binary); DBHeader temp; file.seekg(0); file.read((char*)&temp,sizeof(temp)); int i = 0; //---------------Fehlerhafter Teil------------------------ League templ; for(i = 0; i < temp.leagues;i++) { file.read((char*)&templ,sizeof(templ)); cout << "Loaded League: "<<templ.name.c_str() << endl; } Team tempt; for(i = 0; i < temp.teams;i++) { file.read((char*)&tempt,sizeof(tempt)); cout << "Loaded Team: "<<tempt.name.c_str() << endl; } //---------------Ende fehlerhafter Teil---------------------- file.close(); return 0; };Im Internet steht nur dass die Meldung kommt wenn man versucht Speicher frei zu geben denn einem nicht gehört. Kann mir jemand sagen wo das Problem liegt? Speicher gebe ich ja keinen frei und ich wüsste nicht wo das Programm beim Speicher freigeben scheitern könnte.

-
Du kannst komplexe Klassen nicht einfach so speichern/laden. Du musst sie erst serialisieren.
Stell dir die Klasse string einmal vor. Sie hat einen char* auf den Inhalt und einen int fuer die laenge. Wenn du das nun per file.write() in die Datei schreibst, schreibst du die Adresse auf die der char* schreibt und die laenge in die Datei.
Aber du schreibst nie den string selber...
-
Hmm.... ich glaube ich verstehe was du meinst.
Das heisst ich muss also den String-Inhalt in einen char[] laden und kann in dann so speichern? Und das müsste ich ja dann mit jedem Pointer in der Klasse machen, wenn ich das richtig verstehe? Oh, da wartet ja einige arbeit auf mich.

-
Hello schrieb:
Das heisst ich muss also den String-Inhalt in einen char[] laden und kann in dann so speichern? Und das müsste ich ja dann mit jedem Pointer in der Klasse machen, wenn ich das richtig verstehe? Oh, da wartet ja einige arbeit auf mich.

du musst serialisieren. such mal danach.
das einfachste ist den operator<< und operator>> zu verwenden.
-
Wie sehen DBHeader League und Team aus?
-
DBHeader scheint kein Problem zu sein, besteht ja auch nur aus integers.
struct DBHeader { unsigned short int version; unsigned int players; unsigned int teams; unsigned short int leagues; unsigned int games; };Team hingegen ist schon komplexer und scheint das eigentliche Probllem zu sein:
class Team { public: unsigned int ID; std::string name; std::string wappen; unsigned short int iTrainingTyp; Team(): ID(0) {} Team(std::string strName, std::string strWappen): ID(0),name(strName),wappen(strWappen) {} };
-
Ja, std::string kannst du nicht so speichern. Da musst du ne struktur mit char arrays mit fester größe nehmen oder dir was bauen um std::strings richtig rauszuschreiben.
-
Vielen dank für eure Hilfe.
