Dynamische Funktionen aus String?



  • Kann man aus einem String eine Funktione aufrufen?
    Ich weiss das das Funktioniert:

    void (*funk_zeiger)(int);
    funk_zeiger = einefunktion;
    funk_zeiger(5);
    

    Damit wird die Funktion "einefunktion(5)" aufgerufen aber ich kann char* nicht in void(__cdecl)(int) umwandeln. Weiss jemand wie das geht?



  • String parsen, richtigen Funktionszeiger raussuchen (aus std::map oder so), Argumente erzeugen, Funktion aufrufen.

    Für dein Problem, welches auch immer, wird's aber bestimmt eine weniger aufwendige und vlt. gar elegantere Lösung geben.



  • std::map ? das sieht mir sehr nach klassen und C++ aus. Ich schreibe mein Program in C Konsolenanwendung.
    Hmm eleganter und weniger umstaendlich. Also ich hab eine MYSQL Datenbank mit ungefahr 100 zeilen wo funktionen drinne stehen. Jetzt gibt der benutzter einen Befehl ein. Ich will aber keine Switch anweisung machen mit ueber 100 cases.



  • Ich tippe mal auf einen Designfehler. 😉 Was willst du denn genau machen? Das wird sicher auch ohne 100 Case-Marken zu lösen sein.



  • Hmm ich hab 100 befehle in einer Datenbank. Und ich hab 100 Funktionen. Die moechte ich so kurz wie moeglich verknuepfen. das koennte ich natuerlich mit einer 100 case Switch einfuegen oder irgendwie dynamisch eine funktion aufrufen.



  • XzenTorXz schrieb:

    std::map ? das sieht mir sehr nach klassen und C++ aus.

    Na so ein Wunder, du bist hier im C++-Forum und nicht im C-Forum. Lass dich
    doch verschieben wenn du nach einer C-Lösung suchst. :p



  • Der Hinweis mit der map bleibt auch in C bestehen, nur dass man sich die map selber schreiben oder besorgen muss.



  • Hi

    Naja du kannst auch 100 if-else ifs nehmen :p

    Also was du machen willst ist eine assoziation. Du hast einen schlüssel und willst eine funktion aufrufen die zu diesem schlüssel gehört. Ob du dafür nun switch verwendest oder ebene ne methodmap sind performanceüberlegungen IMHO. Aber um eine zuordnung wirst du nicht herumkommen. Wenn du eine map hast, dann müssen die funktionen alle die selbe signatur haben, bei switch oder if oder was auch immer muss das nich der fall sein, der code wird aber auch länger.

    Wenn du das spezielle problem wirklich so lösen willst wie du gesagt hast, dann würde ich auch ne map benutzen.

    In c könntest du zum beispiel einen binärbaum implementieren der als knoten eine struktur hat die den schlüssel enthält und einen funktionpointer. Oder du vergibst jedem knoten eine id, dann geht die suche schneller weil, die vergleiche insgesammt weniger werden. Dann suchst du eben nach der id und bekommst gleichzeitig den entsprechenden zeiger auf die funktion.

    Sofar ..



  • Einerseits glaub ich nicht, dass ne map schneller ist. Bin mir aber nicht sicher. Andererseits lohnt sich der Aufwand kaum und da ist noch die Sache mit den gleichen Signaturen. Schreib einfach eine seitenlange caseanweisung, am besten so das man es über includes erweitern kann:

    void case_fn(...)
    {
        switch(...)
        {
        #include "std_case.inl"
        #include "meine_tollen_erweiterungen.inl"
        default:
            melde_fehler(...);
            break;
        }
    };
    
    //std_case.inl
    case foo:
        //...
        break;
    case bar:
        //...
        break;
    //...
    
    //meine_tollen_erweiterungen.inl"
    case foo2:
        //...
        break;
    case bar2:
        //...
        break;
    //...
    

    Sonst kann das ja kein Mensch warten...



  • Naja dann werde ich mich mal an die ewiglange switchanweisung machen. Die einzelnen 100 cases waeren nicht das problem. Aber vorher wird noch bei jeder funktion gecheckt wo der benutzer das eingegeben hat und ob er die noetigen rechte hat. Das wuerde das program einfach aus der db lesen. Und dass muss jetzt in jedes case mit rein ;/.


Anmelden zum Antworten