Variable Funktionsnamen
-
Hallo,
ja ich hatte es fast in der Google suche hier drin, dachte mir aber dann, dass die andere vielleicht besser ist.
Erster treffer beschreibt natürlich gleich mein Problem: http://www.c-plusplus.net/forum/viewtopic-var-p-is-1852421.html#1852421typedef void (*stringMappedFun)(); std::map<std::string, stringMappedFun> functionMappings;
Das sagt mir nur Bahnhof. Wir haben bisher leider nicht mit < oder > gearbeitet. Und Namespaces kenne ich jetzt auch nur von php 5.3, in C haben wir die noch nicht eingesetzt. Visual Studio unterringelt das auch. Brauch ich da noch ne Bibliothek? Meldung ist "Error: name followed by '::' must be a class or namespace name".
@player
Ja das geht so in PHP. Habs extra vorher ausprobiert. Die Version mit call_user_func ist sauberer.
Was sind y-Funktionszeiger? Hab kurz gegoogelt, aber der dritte Treffer ist schon dieser Thread^^
Die von dir vorgeschlagene Methode hilft mir leider nicht wirklich weiter, da ich es gerne dynamisch halten würde.
-
Sebbl22 schrieb:
Erster treffer beschreibt natürlich gleich mein Problem: http://www.c-plusplus.net/forum/viewtopic-var-p-is-1852421.html#1852421
typedef void (*stringMappedFun)(); std::map<std::string, stringMappedFun> functionMappings;
Das sagt mir nur Bahnhof. Wir haben bisher leider nicht mit < oder > gearbeitet. Und Namespaces kenne ich jetzt auch nur von php 5.3, in C haben wir die noch nicht eingesetzt. Visual Studio unterringelt das auch. Brauch ich da noch ne Bibliothek? Meldung ist "Error: name followed by '::' must be a class or namespace name".
Das ist auch kein C, sondern C++. Dazu müsstest du noch ein
#include <map>
hinzufügen, damit die Fehlermeldung verschwindet.
Die übrigens anders lauten würde, wenn du einen C-Compiler verwenden würdest ... in C gibt es nämlich keine Klassen oder Namensräume, da müsste ganz einfach ein Syntaxfehler ausgegeben werden.Die von dir vorgeschlagene Methode hilft mir leider nicht wirklich weiter, da ich es gerne dynamisch halten würde.
Das geht aber nicht, da die Namen zur Laufzeit nicht mehr existent sind. Sie werden vom Compiler oder spätestens vom Linker aufgelöst, im Maschinencode stehen dann nur noch numerische Adressen.
-
Nur Funktionszeiger das y ist mir versehentlich dazwischen gerutscht
. Kennst du bereits Zeiger? Wenn nein dann kannst du Funktionszeiger auch noch nicht verstehen.
-
@player
Ja Zeiger haben wir schon gemacht@Bashar
Die Funktionen selbst sind ja fest. Ist vom Titel her blöd gewählt von mir. Die Funktionsnamen sind fest und existieren. Ich will ja nur wenn ich einen String habe z.B. "hilfe", die Funktion "hilfe" aufrufenHey danke. Ich habs jetzt mit den Funktionszeigern. Das geht auch. Is zwar kein richtiger String dann, aber genau das was ich brauche.
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39348.html
-
Sebbl22 schrieb:
Die Funktionen selbst sind ja fest. Ist vom Titel her blöd gewählt von mir. Die Funktionsnamen sind fest und existieren. Ich will ja nur wenn ich einen String habe z.B. "hilfe", die Funktion "hilfe" aufrufen
Ja, aber wie schon erwähnt sind deine Funktionsnamen zur Laufzeit nicht mehr existent. Und ein String kann sich schlielich auch zur Laufzeit bilden oder verändern (z.B. auch durch Benutzereingabe). Ein Rückschluss auf eine von dir im Quellcode benannte Funktion kann also kaum funktionieren.
-
Hm ja aso verstehe was du meinst. Aber meine Strings waren fest vorgegeben von vornherein. Ich blende ein Menü ein und wollte hier nur einfach neue Menüpunkte im Quelltext hinzufügen können. Und das funktioniert gut mit Funktionszeigern, weil ich ja von vornherein weiß, welche Funktion zu welcher Zeit aufgerufen werden soll.
Edit:
wenn du einen C-Compiler verwenden würdest ...
Das war die "IntelliSense" Anmerkung von Visual Studio. Ich schätze die "IntelliSense" Funktion unterscheidet nicht zwischen C/C++. Die Dateien haben die Endung .c
-
Wenn du unbedingt variable Funktionsnamen brauchst, kannst du ja #defines verwenden, ist halt ein schlechter Ersatz:
Bsp.#include <stdio.h> #define MY_FUNC_NAME add_two_ints int MY_FUNC_NAME(int a, int b) //MY_FUNC_NAME wird durch add_two_ints ersetzt { return a+b; } int main() { printf("%d\n", add_two_ints(2,4)); }
-
wxSkip schrieb:
Wenn du unbedingt variable Funktionsnamen brauchst, kannst du ja #defines verwenden, ist halt ein schlechter Ersatz:
Bsp.#include <stdio.h> #define MY_FUNC_NAME add_two_ints int MY_FUNC_NAME(int a, int b) //MY_FUNC_NAME wird durch add_two_ints ersetzt { return a+b; } int main() { printf("%d\n", add_two_ints(2,4)); }
Damit hast du für eine Funktion 2 Namen, toll. Und wie soll er damit das umsetzen, was er will?
-
Achso, stimmt, er will das ja aus einem String ansprechen...
Er kann sich höchstens eine Funktion schreiben, die den String überprüft und dem jeweiligen Funktionspointer zuordnet oder so und das dann mit ganz vielen #defines erleichtern
-
Im Prinzip ist das alles problemlos machbar; du musst nur eine Dictionary programmieren (also std::map) mit Strings als Keys und Funktionszeigern als Values. Das ist ein recht grosser Aufwand
Die Bruteforce-Variante ist ungefähr wie folgt:
typedef struct { const char *key; void (*value)(); } kvp_s_fp; // key-value-pair<string, function-pointer> // Dann ganz einfach: kvp_s_fp fun_tbl[0xff] = {}; // Und die Funktionen, die du brauchst: kvp_s_fp *lookup_fun(const char *) { for (/*...*/) if (fun_tbl[ /*...*/ ] ...) return /*...*/; }
MfG