Forum: Mikrocontroller und Digitale Elektronik Funktionszeiger


von Klaus3 (Gast)


Lesenswert?

In meinem Programm wird es einige Funktionen geben, die neben dem 
normalen Funktionsaufruf auch noch durch eine spezielle Funktion 
aufgerufen werden sollen. Diese Funktion hat einen "int" Parameter, der 
die Nummer der Funktion angibt. Mithilfe eines switch-case Blockes würde 
sich das erledigen lassen. Jedoch denke ich dass ein Array aus 
Funktionszeiger schneller zum Ziel führt. Aber wie bekomme ich ein 
solches Array am bessten initalisiert?

von Oliver (Gast)


Lesenswert?

1
typedef void (*pFunc)(int); 
2
3
void Func1(int);
4
void Func2(int);
5
6
pFunc Arr[2] = {Func1, Func2};
7
8
void Func1(int a) 
9
{ 
10
    //... 
11
} 
12
void Func2(int a) 
13
{     
14
    //... 
15
}

Oliver

von Peter D. (peda)


Lesenswert?

Klaus3 wrote:
> die Nummer der Funktion angibt. Mithilfe eines switch-case Blockes würde
> sich das erledigen lassen. Jedoch denke ich dass ein Array aus
> Funktionszeiger schneller zum Ziel führt.

Man sollte den Compiler nicht unterschätzen. Der kriegt ziemlich gut 
raus, ab wann ne Sprungtabelle schneller ist und nimmt sie dann.


Peter

von P. S. (Gast)


Lesenswert?

Man sollte ihn auch nicht ueberschaetzen, ich habe schon einige Faelle 
erlebt, wo ein von Hand wegoptimiertes switch-case relevante Vorteile 
gebracht hat.

von Klaus3 (Gast)


Lesenswert?

Ich hatte zuvor die Übergabe der Aufzurufenden Funktion per Zeiger auf 
diese Funktion. Eine switch-case Struktur führt zu definitiv viel mehr 
Code was sich nicht erklären lässt wenn man bedenkt dass nun nur noch 
8-Bit Werte übergeben werden müssen. Ich vermute momentan dass vom 
Compiler diese switch-case Struktur (momentan ca 15 Einträge) nicht 
erkannt, oder nicht optimiert wird.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Der Compiler liefert oft auch eine LST-Datei (oder ähnlich), die den 
resultierenden Assembler-(Mnemonic)-Code inclusive der 
Original-Codezeilen als Kommentar enthält. Hier sieht man dann direkt, 
was der Compiler draus macht. Wenn das nicht gefällt, manuell kodieren.

Christian

von Dennis (Gast)


Lesenswert?

1
typedef void (*pFunc)(int); 
2
3
void Func1(int);
4
void Func2(int);
5
6
pFunc Arr[2] = {Func1, Func2};
7
8
void Func1(int a) 
9
{ 
10
    //... 
11
} 
12
void Func2(int a) 
13
{     
14
    //... 
15
}

Aber wie findet nun der eigentliche Funktionsaufruf statt?

von Oliver (Gast)


Lesenswert?

1
Arr[1](42);

Oliver

von Dennis (Gast)


Lesenswert?

Super! Danke!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.