www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Funktionszeiger


Autor: Klaus3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
typedef void (*pFunc)(int); 

void Func1(int);
void Func2(int);

pFunc Arr[2] = {Func1, Func2};

void Func1(int a) 
{ 
    //... 
} 
void Func2(int a) 
{     
    //... 
} 

Oliver

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: P. S. (Gast)
Datum:

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

Autor: Klaus3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
typedef void (*pFunc)(int); 

void Func1(int);
void Func2(int);

pFunc Arr[2] = {Func1, Func2};

void Func1(int a) 
{ 
    //... 
} 
void Func2(int a) 
{     
    //... 
}

Aber wie findet nun der eigentliche Funktionsaufruf statt?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Arr[1](42);

Oliver

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super! Danke!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.