Strings in Structs
-
Hallo ich habe folgendes kompliziertes Problem:
Ich habe ein Struct mit std::string
struct DataEntry{ std::string name; int date_d;//1-31 int date_m;//0-11 int date_y;//ab 1900 int type; std::string type_other; std::string comment; };Zusätzlich habe ich ein Dialog-basiertes Projekt, sodass ich eine Dialog Callback Function habe, in der soll beim drücken des OK Buttons ein struct gefüllt werden und ein Pointer des structs an eine Funktion aus einer Klasse geleitet werden:
case IDC_BUTTON3: //OK //DataEntry de = {"Der Name", 5, 0, 110, 0, "KeinAndereTyp", "KeinKommentar"}; DataEntry de; de.name = "DerName"; de.date_d = 5; de.date_m = 0; de.date_y = 110; de.type = 0; de.type_other = "KeinAndereTyp"; de.comment = "KeinKommentar"; pDataPointer->SetDataEntry(&de); EndDialog(hwndDlg, 0); return TRUE; }pDataPointer ist ein globaler Zeiger auf die Klasse der in der Main initialisiert wurde...
Folgendes ist der Part aus der Klasse:void DataStorage::SetDataEntry(DataEntry* data){ ... SetString("Name", (data->name).c_str(), false, container); SetInt("Typ", data->type, false, container); SetString("TypDesc", (data->type_other).c_str(), false, container); SetString("Comment", (data->comment).c_str(), false, container); };Bei c_str() kommt glaub ich auch der Fehler her, da der Debugger sagt:
Program received signal SIGSEGV, Segmentation fault.
In strlen () (C:\Windows\system32\msvcrt.dll)Es funktioniert alles, wenn ich die strings rauslasse.
Komischerweise funktioniert es auch, wenn ich den aufrufenden Part direkt in die Main schreibe...
Wäre nett wenn mir jmd helfen könnte
-
Könnte es sein, dass der Scope endet, die Objekte zerstört werden und deine Zeiger plötzlich ins Leere zeigen?
Versuch mal DataEntry mit new anzulegen. Das delete kannst du zunächst weglassen, einfach um zu sehen, ob es klappt...
**
Wenn es dann läuft musst du natürlich an passender Stelle den Speicher wieder freigeben.**
-
So?
case IDC_BUTTON3: //OK //DataEntry de = {"das", 5, 0, 110, 0, "", "Kein Kommentar"}; DataEntry *de = new DataEntry; de->name = "DerName"; de->date_d = 5; de->date_m = 0; de->date_y = 110; de->type = 0; de->type_other = "KeinAndereTyp"; de->comment = "KeinKommentar"; pDataPointer->SetDataEntry(de); EndDialog(hwndDlg, 0); return TRUE;So besteht das Problem weiterhin...

Edit: Hab jetzt anstelle von nem Pointer die Variable de global gemacht
geht auch
-
Wird vielleicht die Variablendeklaration durch die Case-Marke irgendwie übersprungen oder sowas?
Probier mal manuell den Scope zu begrenzen:
case IDC_BUTTON3: { //OK //DataEntry de = {"das", 5, 0, 110, 0, "", "Kein Kommentar"}; DataEntry *de = new DataEntry; de->name = "DerName"; de->date_d = 5; de->date_m = 0; de->date_y = 110; de->type = 0; de->type_other = "KeinAndereTyp"; de->comment = "KeinKommentar"; pDataPointer->SetDataEntry(de); EndDialog(hwndDlg, 0); } return TRUE;
-
Nein ich glaub das würd auch nicht funktionieren, weil ja dann der Scope noch kleiner wäre, wie schon im Edit geschrieben, klappt es wenn ich die Variable global mache, weil es wird ja ein Pointer vom Struct übergeben
Also danke für den Tip mit dem Scope...
-
HostedDinner schrieb:
Nein ich glaub das würd auch nicht funktionieren, weil ja dann der Scope noch kleiner wäre, wie schon im Edit geschrieben, klappt es wenn ich die Variable global mache, weil es wird ja ein Pointer vom Struct übergeben
Also danke für den Tip mit dem Scope...Im Falle von new wird davon der Scope nicht beeinflusst, da du das Objekt manuell mit delete zerstören musst. Mir ging es eher darum, dass ich die Vermutung hatte, dass es durch die Initialisierung in der Case-Marke zu Problem kommt. Daher die Klammern darum. Du kannst und solltest diese Variante also ruhig mal ausprobieren. Mein Compiler weist mich auf sowas sogar hin.
-
Was macht denn SetString genau?
Ich nehme mal an, dass den Parameter behalten will und da der String, nachdem das case verlassen wurde existiert der String ja nicht mehr und der C-String Zeiger zeigt auf ungültige Daten.Wenn das struct global ist, dann bleibt der Speicher ebenfalls genügend lange gültig und die Funktion macht keine Probleme.
Wichtig ist somit zu wissen, wie lange SetString (oder was sich da auch immer dahinter versteckt) den String beansprucht dann kannst das Objekt auch wieder korrekt zerstören.