map value an Funktion übergeben!



  • Zuerst einmal hallo an Alle! 😉

    Ich möchte mit Hilfe des mappings einen CommandPrompt schreiben, welcher verschiedene Befehle executieren kann.

    #include <iostream>
    #include <string>
    #include <map>
    
    int main()
    {
      std::string input;
      std::map <std::string, int> mymap;
      std::map<std::string, int>::iterator it;
      mymap["list"] = 1;
      mymap["save"] = 2;
      mymap["quit"] = 3;
    
      std::cout <<"Befehl? "; 
      getline(std::cin, input);
    
      for (it = mymap.begin(); it != mymap.end(); it++)
      {
        if(it->first == input)
        {
          return it-> second;
        }
    
        else
        {
          std::cout<<"Command not found"<<std::endl;
        }
    
      }
    }
    

    Soweit so gut (das funktioniert auch ^^), aber nun möchte ich, wenn ein passender Eintrag im Container gefunden wurde, den integer Wert einer Funktion execute() übergeben welche dann mit Hilfe eines Switch/Case Statements dann die entsprechenden weiteren Funktionen aufruft!
    Dies will mir einfach nicht gelingen!
    Wenn ich den it->second Wert einer anderen Variable zuweiße, also

    int key = it->second;
    

    und diesen dann übergebe kommt ein Seg Fault!

    als ich probiert habe, den it Wert mit Referenz zu übergeben, also

    execute(it&->second)
    

    funktioniert es auch nicht!

    Bitte um Hilfe! 😕

    Vielen Dank schon im Vorhinein

    trunksen


  • Mod

    1. Das ist doch wohl nicht dein Ernst, dass du die Map von Hand durchiterierst und alle Einträge vergleichst. Die map ist doch gerade dafür da, dass du das nicht tun musst und stattdessen einfach mymap[input] schreiben kannst (vorher aber eventuell prüfen, ob der Eintrag auch existiert, sonst wird ein neuer angelegt).
    2. Wenn du einen Segfault bekommst, dann wird das entsprechende Element wohl nicht existieren.



  • Hallo!

    Vielen Dank für die schnelle Antwort (aber warum der forsche Ton?)!

    Das ist doch wohl nicht dein Ernst, dass du die Map von Hand durchiterierst und alle Einträge vergleichst. Die map ist doch gerade dafür da, dass du das nicht tun musst und stattdessen einfach mymap[input] schreiben kannst (vorher aber eventuell prüfen, ob der Eintrag auch existiert, sonst wird ein neuer angelegt).

    Das habe ich nicht gewusst, die Beispiele die ich gesehen habe waren meistens mit einer Schleife!

    Meine neue Schleife

    if(mymap[input])
      {
        int key = mymap[input];
        execute(key);
      }
    

    und

    void execute(int& key)
    {
    
      std::cout<<key<<std::endl;
    }
    

    Funktioniert wunderbar!

    Vielen Dank für den Tipp 😃 !

    mfg trunksen



  • trunksen schrieb:

    if(mymap[input])
      {
        int key = mymap[input];
        execute(key);
      }
    

    Ich bezweifle, dass du dir im klaren bist, was das if (mymap[input]) tut. Das funktioniert hier zufällig, hat aber ungewollte Nebeneffekte. Du solltest das mit find umschreiben.





  • Danke, genau so meinte ich es 😉


Anmelden zum Antworten