www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Funktionszeiger


Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich möchte Funktionsaufrufe von dem Wert einer Variable abhängig machen, 
um mir lange if-Abfragen zu ersparen.
Hat die Variable X den Wert 0, soll Func1 aufgerufen, hat sie den Wert 
1, soll Func2 aufgerufen werden, etc.

Wie kann ich das am besten anstellen?


Viele Grüße

Dennis

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void funktionsbestimmung)
{
 if (!(Wert)) func1 ();
 else func2 ();
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dennis schrieb:
> Hallo zusammen,
>
> ich möchte Funktionsaufrufe von dem Wert einer Variable abhängig machen,
> um mir lange if-Abfragen zu ersparen.
> Hat die Variable X den Wert 0, soll Func1 aufgerufen, hat sie den Wert
> 1, soll Func2 aufgerufen werden, etc.
>
> Wie kann ich das am besten anstellen?

Mit einem Array von Funktionszeigern
http://www.mikrocontroller.net/articles/FAQ#Funktionszeiger

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
:) Okay, nun sind das aber ein paar Funktionen mehr ... "etc" ;)

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja und wenn du die nicht global hast, dann halt...
[c]
void unktionsbestimmung (uint16_t wert)
{
 if (!(wert)) func1 ();
 else func2 ();
}

Autor: manateemoo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der code ist NICHT getestet. Aber so in der Art könnte man's machen:

typedef void(*tpVoidFkt)(void);
#define byte unsigned char
#define NOFKT ((tpVoidFkt)0)

tpVoidFkt FktList[10];


void Init(void)
{
  byte bCtr = sizeof(FktList);
  while(bCtr--) FktList[bCtr] = NOFKT;
}

void SetFkt(byte bFktNbr, tpVoidFkt pFkt)
{
  FktList[bFktNbr] = pFkt;
}

void CallFkt(byte bFktNbr)
{
  if ( NOFKT != FktList[bFktNbr] ) (FktList[bFktNbr])();
}


void Test0(void)
{

}

void Test1(void)
{

}



void main(void)
{
      Init();

      SetFkt(0,&Test0);
      SetFkt(1,&Test1);

      CallFkt(0);
      CallFkt(1);
}

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Mit einem Array von Funktionszeigern
> http://www.mikrocontroller.net/articles/FAQ#Funktionszeiger

Super! Läuft! :) Danke!!

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es bei der Sprache C keine Select-Case Funktion?

interessiert sich
Paul

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Paul Baumann (Gast)

>Gibt es bei der Sprache C keine Select-Case Funktion?

Sicher, nur dass die dort switch heißt ;-)
Ist aber für größere Mengen an Funktionen unübersichtlicher und in der 
Ausführung langsamer.

MfG
Falk

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha. Vielleicht ist C doch nicht so unbrauchbar, wie ich dachte...
;-)
MfG Paul

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für Freunde kompakter Schreibweisen bietet C99 die Möglichkeit, das
Funktionspointerarray direkt mit in den Aufruf zu packen. Wem die
Schreibweise zu kryptisch ist (Alternative 1), kann den Aufruf auch
durch Makros etwas verschönern (Alternativen 2 und 3):
#include <stdio.h>

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
int div(int a, int b) { return a / b; }

#define VCALL(i,r,a,...) ((r(*[])a){__VA_ARGS__}[(i)])
#define VCALLI(i,...) VCALL(i,int,(int,int),__VA_ARGS__)

int main(void) {
  int a=12, b=4, c, i;

  for(i=0; i<4; i++) {

    // Alternative 1: ohne Makro
    c = (int (*[])(int, int)){add, sub, mul, div}[i](a, b);

    // Alternative 2: mit universellem Makro
    //        + Selektorvariable
    //        |   + Datentyp des Rückabewerts
    //        |   |        + Datentypen der Argumente
    //        |   |        |              + Funktionen
    //        |   |        |              |            + Argumente
    //        |  _|_  _____|____  ________|_________  _|__
    c = VCALL(i, int, (int, int), add, sub, mul, div)(a, b);

    // Alternative 3: mit spezialisiertem Makro
    c = VCALLI(i, add, sub, mul, div)(a, b);

    printf("%d\n", c);
  }
  return 0;
}

Es ist natürlich Geschmackssache, ob man das wirklich so machen will.
Ich wollte es nur mal als Proof-of-Concept in den Raum stellen ;-)

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Aha. Vielleicht ist C doch nicht so unbrauchbar, wie ich dachte...

Doch. Man kann damit wunderbar Probleme lösen, die man ohne C nicht 
hat.;-)

MfG Spess

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
" C-Programmierer sind wie Bauarbeiter. - Wer einen Schutzhelm trägt, 
ist kein echter Kerl. "

MEGALOL

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
O.T.
Für mich brauchte die Welt nur aus Pascal-Programmierern zu bestehen.
Das liegt schahr-weinlich daran, daß ich Algol als erste Sprache gelernt
habe. Ich weiß nicht, was sich die "C"-Erfinder dabei gedacht haben,
alle verfügbaren Sonderzeichen im Quelltext zu verhackstücken...
:-(
MfG Paul

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
$ und @ und ` sind unbenutzt.
Man muß doch etwas Raum lassen für Erweiterungen...

Wobei $ teilweise in Bezeichnern zulässig ist.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Paul Baumann (Gast)

>habe. Ich weiß nicht, was sich die "C"-Erfinder dabei gedacht haben,
>alle verfügbaren Sonderzeichen im Quelltext zu verhackstücken...
>:-(

Naja, C ist halt ein Kind der 70er, da war man mit dem LSD noch im 
breiten Versuchsstadium . . . ;-)

Autor: Klaus Wachtler (mfgkw)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Paul Baumann schrieb:
> Das liegt schahr-weinlich daran, daß ich Algol als erste Sprache gelernt
> habe.

Da hätte ich noch ein Schmuckstück von 1962 im Regal liegen...

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LSD? War das nicht das Zeug, nach dessen Einnahme man Deckenlampen ohne
Leiter wechseln konnte?
;-)

Herr Meier gab Kollegin Schmidt
Lysergsäure-diethyl-amid
Frau Schmidt schwebt rosa durch den Raum,
Herr Meier, -ja der fasst es kaum...

MfG Paul

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Klaus
Klasse! Heb das gut auf,-in ein paar Jahren werden sich die Leute wieder
damit befassen, wenn sie die Orientierung im Wirrwarr der heutigen
Programmiersprachen vollends verloren haben.
(Das meine ich ausnahmsweise mal ernst)
MfG Paul

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar halte ich das in Ehren.
Alleine schon, weil es von der Zuse KG ist.

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> Klar halte ich das in Ehren.
> Alleine schon, weil es von der Zuse KG ist.

Und vor allem, weil es der Herr Baumann geschrieben hat!

Paul, ist das "R." ein Druckfehler, oder stammt das Werk gar nicht von
dir, sondern von einem Bruder oder Vater?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

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.