Falsche Werte aus Containern

Orthak

Mitglied
Hallo,
ich arbeite seid kurzem mit den STL Containern vector und map. Mein Problem liegt darin, das die Werte bei Entnahme aus dem map Conatiner völlig falsch sind. Um folgendes geht es konkret:

Es gibt eine Klasse A, welche unter anderem einen vector container enthält der structs mit 3 charpointern besitzt (einer davon ist ein Array). Objekte der Klasse A speichere ich nun in einer map des Typs <char*, Klasse A> in Klasse B. Versuche ich nun zB. ...

Code:
map[objektName].vektor.at(xyz).einerDerChars

... sind die Werte völlig falsch. Häufig gehören die zurückgegebenen Zeichenketten zu anderen structs im vektor, manchmal sind es auch sinnlose ACSII-Zeichen. Ich nehme an die Zeiger verweisen auf einen falschen Speicherbereich.

Verwirrend ist, das die Werte korrekt sind sobald ich sie innerhalb von Methoden aus Klasse A abrufe. Sprich ...

Code:
vektor.at(xyz).einerDerChars

... funktioniert innerhalb einer Funktion von Klasse A. Ich hab nun schon einiges probiert und bin inzwischen ziemlich ratlos :confused: .
 
Hi.

Der Zugriff bei deiner Map passiert aber nicht über Namen, sondern über Zeiger!

Mach aus der Map einfach mal eine std::map<std::string, A>.

Gruß
 
Danke für den Tip, doch leider hat das Ändern von char* auf string keine Besserung gebracht. Vielleicht gibt es etwas, das aus meinen Schilderungen nicht ersichtlich war. Anbei ein Codeschnipsel aus Klasse B (Teil der Hinzufügen-Funktion).

Code:
// Paar erzeugen
QAPaar tuple = {
	frage.c_str(),
	antwort.c_str(),
	{fAntwort[0].c_str(), fAntwort[1].c_str(), fAntwort[2].c_str() }
};

// Dem passenden Objektkatalog hinzufuegen
Catalogs[activeCatalog].QASammlung.push_back(tuple);

// TESTAUSGABE
cout << "Frage: " << Catalogs[activeCatalog].QASammlung.back().question << endl;
cout << "Antwort: " << Catalogs[activeCatalog].QASammlung.back().answer << endl;

Bei der Testausgabe stimmen die auch Werte noch. Bei späterem Abruf aus der selben Klasse nicht mehr. Noch einige Anmerkungen:
- Catalogs: map<string, Klasse A>
- activeCatalog: String mit dem Namen des gewünschten Objekts (Klasse A)
- QASammlung: vector<QAPaar>
- QAPaar: struct (const char* question; const char* answer; const char* wrongAnswers[3])
- QASammlung ist private (Klasse A kennt Klasse B als friend class)
- frage, antwort und fantwort[0-2] sind strings
- question und answer sind const char* Werte aus QAPaar
 
Danke für den Tip, doch leider hat das Ändern von char* auf string keine Besserung gebracht. Vielleicht gibt es etwas, das aus meinen Schilderungen nicht ersichtlich war. Anbei ein Codeschnipsel aus Klasse B (Teil der Hinzufügen-Funktion).

Code:
// Paar erzeugen
QAPaar tuple = {
	frage.c_str(),
	antwort.c_str(),
	{fAntwort[0].c_str(), fAntwort[1].c_str(), fAntwort[2].c_str() }
};
Die Methode std::string::c_str() liefert einen Zeiger auf temporären Speicher zurück. Diesen Zeiger darfst du nicht speichern, da du ihn nicht besitzt und er seine Gültigkeit gleich mit der nächsten Anweisung wieder verlieren kann. Warum verwendest du denn C-Strings? Nimm einfach überall std::string - das macht das Ganze viel einfacher.

Evtl. solltest du dir auch einen geigneten Konstruktor für dein QAPaar struct schreiben.

Gruß
 
Ich habe die Struktur aus einem C-Programm entnommen. Die Idee überall Strings zu nehmen kam mir dann auch und hat das Problem gelöst :p .

Ein weiterer Fehler war, das ich die Objekte durch Ablage in die map letztendlich kopiert habe und bei Abruf von Werten der Originalobjekte natürlich keine vernünfigen Rückgaben bekam.

Danke nochmal für die Hilfe, nun läuft alles wie es sollte!
 
Zurück