Eingabe verwalten



  • Hi,
    ich weiss nicht genau wie man es am besten macht, auf jeden Fall wollte ich mehrere (ca. 50) Befehle in der Console zulassen und wollte fragen, wie ich die am besten verwalte, da die switch case anweisung meines wissens nur mit zahlen geht und eine if-Bedingung ich einfach nur schlecht finde weiss ich nicht genau wie ich die Befehle verwalten soll.

    Habe zwar schon mal ein bisschen gesucht, aber wonach ich genau suchen sollte wusste ich auch nicht... von daher war ich bis jetzt eher erfolglos.

    Hoffe mir kann jemand helfen.

    Schon mal Danke im Voraus.

    Rgds
    Coda



  • Halbwegs elegant lässt sich das durch eine map lösen:

    void DoThis( const vector<string>& params )
    {
       // ...
    }
    
    void DoThat( const vector<string>& params )
    {
       // ...
    }
    
    void HandleInput()
    {
        typedef void (*NotifyFunc)( const vector<string>& );
        static map<string,NotifyFunc> funcs;
        if ( funcs.size() == 0 ) // Wenn die map noch nicht initialisiert ist
        {
            funcs["DoThis"] = &DoThis;
            funcs["DoThat"] = &DoThat;
        }
    
        string name
        vector<string> params
        // Funktionsnamen und Parameter einlesen
    
        if ( ! funcs.find( name ) )
            dann fehler
    
        funcs[name]( params );
    }
    

    Oder so 🙂

    edit: Ups, was verbessert..



  • gleich richtige Handler Klassen statt nur Funktionen verwenden.



  • Habe mich mal son bisschen in maps eingelesen, stosse jedoch immer noch auf ein paar Probleme und hoffe man kann mir dabei helfen.

    #include <iostream>
    #include <cstring>
    #include <map>
    using namespace std;
    
    void test() {
       cout << "lol";
       ....
    }
    
    int main()
    {
    char eingabe[25];
      map<const char*, ???> code;
      code["help"] = test;
    
    cin >> eingabe;
    
    map<const char*, ???>::iterator iter = code.find(eingabe);
    
    if(iter != code.end())
    code[eingabe];
    
    else
    cout << "Unbekannter Befehl.";
    }
    

    Rgds
    Coda



  • Erstmal solltest du statt "char*" lieber "std::string" verwenden - der Standardvergleich von char-Zeigern macht bestimmt nicht das, was du erwartest (der vergleicht die Adressen - und dein lokales Array "eingabe" ist IMMER ungleich dem String-Literal "test").

    Zweitens: Funktionszeiger sind das Zauberwort:

    typedef void (*pf)();
    
    void test(){...}
    
    ...
    
    map<string,pf> code;
    ...
    if(iter!=code.end())
      (*iter)();//oder code[eingabe](); - das leere Klammerpaar ist notwendig
    


  • Ah... hat super funktioniert, danke

    Rgds
    Coda


Log in to reply