Unklarheit bei map < > Container
-
Hallo,
Folgendes Problem. Ich arbeite mit 2 Maps, die vom gleichen Typ sind:
first -> integer index
second -> pointer auf eine 1-Dimensionale Liste (Vektor)Im Header (s.u.) als MTrigMapType definiert.
Nun möchte ich nacheinander die beiden Maps mit verschiedenen Vektoren versehen, je nach Index wird ein anderer Vektor zugewiesen.
Im Beispiel hier nur mit einem Durchlauf (nur Index 0).Wenn ich die erste Map fertig habe und sie danach wieder auslese (Befehl: "gib mir den Vektor an Index 0") bekomme ich auch wieder meinen Vektor. Alles OK.
Wenn ich jedoch vor diesem Auslesen noch die zweite Map befülle (gleiche Art und Weise), gelingt der AUslesevorgang (der ersten Map) nicht mehr, sodern ich bekomme den Vektor zurück den ich der anderen Map zugewiesen habe.
Wie kann so etwas kommen? In meiner Auslesefunktion (ganz unten) übergebe ich ja den Map-Namen, der ausdrücklich Map-Nr.1 ist und nicht Nr. 2, trotzdem gibt die Fkt mit den Inhalt von Map2 zurück.Kann mir das jemand erklären?
Vielen Dank schonmal !!!
Header:
---------typedef std::vector<TriggerType*> TTrigs; typedef std::map<int, TTrigs*> MTrigMapType; MTrigMapType mRxTrigList; MTrigMapType mTxTrigList;Source:
---------vTmpList.clear(); FillTrigList(vTmpList); // fill list in extern function mRxTrigList.insert(make_pair(0, &vTmpList)); // add list to map /* TEST: Read out list again */ TTrigs tmp0 = GetTrigListfromMap(0, mRxTrigList); #if 0 vTmpList.clear(); FillTrigList(vTmpList); // fill list in extern function mTxTrigList.insert(make_pair(0, &vTmpList)); // add list to map #endif /* TEST: Read out list once again */ TTrigs tmp1 = GetTrigListfromMap(0, mRxTrigList);TTrigs Module::GetTrigListfromMap(int Idx, MTrigMapType map_name) { MTrigMapType::iterator iter = map_name.begin(); iter = map_name.find(Idx); if( iter != map_name.end() ) return *iter->second; else { // Error return NULL; } }
-
Irgendwie zu wenig Code...
Du machst was gefährliches: In eine Struktur die nen Pointer erwartet legst du eine Referenz auf ein lokales Objekt. Wenn das referenzierte Objekt nicht in der main liegt oder ein globales Objekt ist, wird das nach Ende der Funktion zerstört - das wars!
Das eigentlich Problem liegt wohl daran dass du immer die selbe Liste (vTmpList) in beiden maps ablegst. Leg mal bitte die Listen separat mit new an oder legt in die Map gleich ListValues nicht pointer.
-
He, du hast recht. Danke ! Ich sehe es jetzt auch.
Ich speichere in der Map die Adresse der TempLste. Diese benutz ich danach wieder mit anderen Werten (gleiche Stelle im RAM wird neu genutzt).
Bei AUslesen später wird von der Adresse der TempList gelesen, die ja wieder anderes enthält.WIe meinst du das mit Listvalues?
-
se1111 schrieb:
WIe meinst du das mit Listvalues?
typedef std::map<int, TTrigs*> MTrigMapType;ändern in
typedef std::map<int, TTrigs> MTrigMapType;Da TTrigs selber eine Liste aus Pointern ist geht kopieren ratzfatz.