Ich habe so etwas schon mit einer SWITCH gemacht, dachte nur auf diese Weise wäre es übersichtlicher da es ja eine Bezeichnung und keine Nummer wäre.
Danke.
Ich habe so etwas schon mit einer SWITCH gemacht, dachte nur auf diese Weise wäre es übersichtlicher da es ja eine Bezeichnung und keine Nummer wäre.
Danke.
Doch, das geht theoretisch auch, nicht direkt in C, aber über Umwege. Du kannst Dir ein externes Tool oder Script bauen, dass alle Module Deines Projektes im PreBuild, also vor dem Kompilieren, einmal durchscannt, die aufrufbaren Funktionen erfasst (ggf. durch Attribut, Signatur oder Kommentar gekennzeichnet) und zu einer größeren Anweisung zusammenpackt. Diese größere Anweisung kann sowohl einfach nur über StringCompare den gesamten Namen vergleichen (langsam) oder auch einzelne Bestandteile der Zeichenketten in einer baumartigen Struktur bis zum vollständigen Namensvergleich als If-Anweisungen heruntersteppen.
So ein Werkzeug bezeichnet man als SingleShot-Code-Generator (Weil er Code generiert, der den Code des vorhergehenden Durchlaufes vollständig überschreibt, also eigentlich die Datei mit der möglicherweise recht großen Sprungsanweisung bei jedem Durchlauf vor dem Kompilieren neu erstellt.)
Danke, aber das ist dann doch mehr Aufwand wie es am Ende nutzen würde.
ich denke schon, dass das geht.
Du liest aus einer Datei einen Variablen-Namen als Variablen-String (z.B. char * strbuf), im einfachsten Fall einfach nur ein Zeichen oder wenigstens gleich lange strings.
zunächst deklarierst du deine Funktionen
dann liest du aus deiner Datei:Code:void umwandeln() { }; void loeschen() { }; void ausschalten() { };
Den String übergibst du deiner Funktion tuwas():Code:FILE * pFile; char strbuf[10]; pFile = fopen ("myfile.txt" , "r"); fgets (strbuf, 6, pFile);
Ich vermute, das könnte so gehen.Code:void tuwas(char * str) { if (str == "umwand") { umwandeln() }; else if (str == "loesch") { loeschen() }; else if (str == "aussch") { ausschalten() }; }
Am Schluss nicht vergessen:
Code:fclose (pFile);
So habe ich es derzeit laufen![]()
das liest sich bei dir aber anders: du hast geschrieben, du hättest es über Nummern gemacht, und wolltest stattdessen Funktionsnamen lesen, denn "auf diese Weise wäre es übersichtlicher da es ja eine Bezeichnung und keine Nummer wäre."
Richtig. So habe ich das auch. Aber das ist eine andere Baustelle und ich wollte wissen ob ich aus einer Datei nur eine Nummer einlesen kann, welche ich über eine SWITCH dann verwende, oder ob ich auch anstelle der Nummer auch einen Namen der Funktion verwenden kann. So habe ich mittlerweile 7 Funktionen, welche ich auf diese Weise mit SWITCH aufrufe. Das läuft und kann auch so bleiben. Die 7 kann ich mir grade noch so merken, welche Zahl welche Funktion letzten Endes auslöst.
Da ich nun aber das Ganze noch ausbaue und dafür eine neue SWITCH eigentlich einbauen wollte, kam mir der Gedanke, da ich schätzungsweise 50 Funktionen nutzen will (nicht alles die selben Funktionen, nur eben auch mal mit verschiedenen Variablen), dass es mit Namen doch übersichtlicher werden würde. Da das aber nicht klappt und es mit den Variablen auch einfacher ist mit der IF Variante, habe ich es eben auf diese Weise gelöst.
Ich tue also Beides, nur bei dem Problem, weshalb ich die Frage gestellt habe, mit IF. Die bereits fertige Geschichte mit SWITCH.
Lesezeichen