PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Funktonen aus Funktion starten?



hirnfrei
09.02.2016, 16:51
Mahlzeit!

Vielleicht habe ich den Titel schlecht gewählt, aber was besseres ist mir nicht eingefallen.

Mich würde mal interessieren, kann ich, zum Beispiel aus einer Datei, variable abrufen die den Namen einer Funktion darstellt?

Beispielsweise in einer Datei steht "umwandeln" und damit soll dann die Funktion



void umwandeln()


starten. Funktioniert das? Oder geht es nur mit einer if?

redround
09.02.2016, 17:09
nein ... das geht so nicht. Der C-Programmcode wird ja durch den Compiler in HEX-Code übertragen. Dadurch weiß der HEX Code aber nicht mehr, was mit umwandeln() gemeint ist. Deshalb kannst Du die Funktion so nicht während der Laufzeit aufrufen. Du must also ein IF (oder vermutlich besser ein SWITCH) nutzen, um bei Erkennen des Datei-Inhaltes die richtige Funktion anzuspringen.

hirnfrei
09.02.2016, 17:14
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.

Holomino
10.02.2016, 18:02
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.)

hirnfrei
10.02.2016, 18:23
Danke, aber das ist dann doch mehr Aufwand wie es am Ende nutzen würde.

HaWe
10.02.2016, 18:51
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


void umwandeln() { };
void loeschen() { };
void ausschalten() { };

dann liest du aus deiner Datei:



FILE * pFile;
char strbuf[10];
pFile = fopen ("myfile.txt" , "r");
fgets (strbuf, 6, pFile);


Den String übergibst du deiner Funktion tuwas():


void tuwas(char * str) {
if (str == "umwand") { umwandeln() };
else
if (str == "loesch") { loeschen() };
else
if (str == "aussch") { ausschalten() };

}

Ich vermute, das könnte so gehen.

Am Schluss nicht vergessen:

fclose (pFile);

hirnfrei
10.02.2016, 20:38
So habe ich es derzeit laufen :)

HaWe
10.02.2016, 21:20
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."

hirnfrei
10.02.2016, 21:44
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.

HaWe
11.02.2016, 08:19
switch kann bei C immer nur Integer Konstanten verwenden. Diese werden vom Compiler in goto Sprungadressen umkompiliert.
Zwar tut switch im Endeffekt nicht viel anderes als if, aber if ist der mächtigere Befehl in C, denn if kann alle möglichen Bedingungen und Vergleiche verarbeiten.

hirnfrei
11.02.2016, 10:06
Ich weiss. Dazu ist es eben auch übersichtlicher. Für mein erstes Problem ist SWITCH aber in Ordnung. Wie gesagt, für das nächste Problem ist das Ganze wieder auf IF aufgebaut :)