String - Funktion
-
Hallo,
wie schaffe ich eine Konvertierung einer Eingabe (String) zu einer Funktion?
Also:
Ein Benutzer gibt z.B. bei einer Abfrage sin ein. Dann soll das Programm den String sin als Funktion sin verwenden können.Gruß
Boris
-
also ein einfacher ansatz, wenn ich dich richtig verstanden habe, wären viell fktzeiger?
einfaches beispiel:
string command[4]={"start","exit","test","shutdown"}; typedef void(*function)(); void start(){cout<<"System starting...."<<endl;} void exit(){cout<<"System exiting...."<<endl;} void test(){cout<<"test"<<endl;} void shutdown(){cout<<"System shutting down...."<<endl;} function Function[]={start,exit,test,shutdown}; int main(int argc, char* argv[]) { bool fail=true; string commandstring; cin>>commandstring; for(int i=0;i<4;i++) { if(commandstring==command[i]) { Function[i](); fail=false; } } if(fail) cout<<"Falsches Kommando"<<endl; getch(); return 0; }
-
Idee ist nicht schlecht, nur kann ich vorher nicht sagen, was für Funktionen kommen. Alle aufzuzählen und in einem Array zu speichern ist nicht möglich.
-
du weißt nicht, welche funktionen kommen können?
versteh ich nicht genau!
-
Den Gedanken anhand des textuellen Namens "automatisch" einen Funktionszeiger zu bekommen schlag Dir mal gleich aus dem Kopf
denn im compilierten Programm ohne Debug-Symbole gibt es keine Funktionsnamen mehr.Du könntest natürlich die Symboltabellen einer Shared Library (DLL / .so) durchsuchen, aber das ist alles andere als Plattformunabhängig und funktioniert wie gesagt nur für DLLs.
-
viel anders als wie das beispiel gehts nicht.
Der Compiler muss doch schon zur Compuilezeit die ganzen Sprünge und so einbauen, da kann nich erst einer zur Laufzeit kommen und sagen "ruf mir jetzt mal sinus auf", das geht vielleicht mit php oder so (kA ob das wirklich geht). Ausserdem: woher soll der Compiler denn wissen, wenn nicht mal du weißt, was kommt, was kommt und wie soll er dann diese Funktionen einbinden, die er nicht mal kennt...
-
Du kannst auch eine map verwenden und bei Bedarf erweitern:
typedef void(*func)(); map<string,func> functions; //Funktion eintragen: void register_func(const string& name,func fn) { functions.insert(make_pair(name,fn); } void call_func(const string& name) { map<string,func>::iterator pos=functions.find(name); if(pos!=functions.end()) pos->second(); else cerr<<"unbekannte Funktion '"<<name<<"'\n"; }(Zur Laufzeit trägst du dann per register_func() alle Funktionen ein, die du verwenden willst)
-
aber AFAIK gibt es keine möglichkeit, durch eingabe eines strings, eine "unbekannte" funktion aufzurufen!
Irgendwie muss schon kalr sein, das wenn dies eingegeben wird, das ausgeführt wird!