pointer auf map an funktion übergeben und Werte der map bearbeiten / prüfen
-
Hi, hab ein Problem bei der Parameterübergabe:
Die Funktion soll die andere aufrufen und den Pointer auf die Map übergeben:
void rpc_getGlobalOption() { map<string,string> ariaGlobOptions; ariaGlobOptions["bt-request-peer-speed-limit"] = ""; ariaGlobOptions["listen-port"] = ""; ariaGlobOptions["xml-rpc-listen-port"] = ""; ariaGlobOptions["split"] = ""; ariaGlobOptions["max-download-limit"] = ""; ariaGlobOptions["max-overall-download-limit"] = ""; ariaGlobOptions["max-concurrent-downloads"] = ""; ariaGlobOptions["lowest-speed-limit"] = ""; ariaGlobOptions["xml-rpc-max-request-size"] = ""; aria_getGlobalOption(myConf["ariaURL"], &ariaGlobOptions); }
Nun die Funktion die aufgerufen wird:
void aria_getGlobalOption(string serverUrl, map<string,string>* options) { *options["split"] = "test"; }
Die zweite Funktion habe ich jetzt stark vereinfacht da hier eben das Problem liegt...
Würde in dieser auch gerne noch prüfen ob der Schlüssel XY (z.B. eben split) existiert und, wenn ja, diesem Element dann eben einen Wert zuweisen.Hoffe auf Hilfe, keine Ahnung was ich da so falsch mache, hab schon x-Varianten probiert.
Danke schonmal!
-
Übergib das Objekt als Referenz:
void rpc_getGlobalOption() { map<string,string> ariaGlobOptions; ... aria_getGlobalOption( myConf["ariaURL"], ariaGlobOptions ); } void aria_getGlobalOption(string serverUrl, map<string,string>& options) { options["split"] = "test"; }
Du solltest dir in dem C++ Buch deiner Wahl noch einmal die unterschiedlichen Möglichkeiten der Parameterübergabe angucken, da scheint noch was im Argen zu sein. Häufig kann man Parameter per Referenz oder const Referenz übergeben, in C++ sind Zeiger oder call-by-value für komplexe Objekte eher die Ausnahme als die Regel.
Edit:
Bei einer map macht es keinen Unterschied, ob man einen neuen Schlüssel erzeugt oder einen bestehenden aktualisiert, wenn man über den operator[] darauf zugreift (anders als map::insert). Deine Zuweisung macht also schon genau das, was du möchtest.
-
Vielen Dank, funktioniert.
Zur Prüfung ob der Wert existiert meinte ich, dass ich in der Funktion aria_getGlobalOption eine ganze Anzahl an Parametern zurückbekomme und ich möchte der Map nur die Werte für die Schlüssel zuweisen, welche ich vorher auch definiert habe.
Sollte dann wohl über find() funktionieren?
EDIT: Ja, geht jetzt ganz normal über find!
-
Babblfish schrieb:
*options["split"] = "test";
* ist ain Präfix-Operator
[] ist ein Postfix-Operator
In C++ gilt die "Postfix- vor Präfix-Rechnung", also
Postfixoperatoren binden immer stärker als Präfixoperatoren.
Demnach ist*options["split"] = "test";
äquivalent zu
*(options["split"]) = "test";
und nicht zu
(*options)["split"] = "test";
Letzteres ist das, was Du für die richtige Gruppierung hättest schreiben müssen.
-
Oh, gut zu wissen. Danke, werd ich mir merken!