Forum: Mikrocontroller und Digitale Elektronik Funktionszeiger


von Dennis (Gast)


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

von Dennis (Gast)


Lesenswert?

1
void funktionsbestimmung)
2
{
3
 if (!(Wert)) func1 ();
4
 else func2 ();
5
}

von Karl H. (kbuchegg)


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

von Dennis (Gast)


Lesenswert?

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

von Dennis (Gast)


Lesenswert?

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

von manateemoo (Gast)


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);
}

von Dennis (Gast)


Lesenswert?

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

Super! Läuft! :) Danke!!

von Paul Baumann (Gast)


Lesenswert?

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

interessiert sich
Paul

von Falk B. (falk)


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

von Paul Baumann (Gast)


Lesenswert?

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

von Yalu X. (yalu) (Moderator)


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):
1
#include <stdio.h>
2
3
int add(int a, int b) { return a + b; }
4
int sub(int a, int b) { return a - b; }
5
int mul(int a, int b) { return a * b; }
6
int div(int a, int b) { return a / b; }
7
8
#define VCALL(i,r,a,...) ((r(*[])a){__VA_ARGS__}[(i)])
9
#define VCALLI(i,...) VCALL(i,int,(int,int),__VA_ARGS__)
10
11
int main(void) {
12
  int a=12, b=4, c, i;
13
14
  for(i=0; i<4; i++) {
15
16
    // Alternative 1: ohne Makro
17
    c = (int (*[])(int, int)){add, sub, mul, div}[i](a, b);
18
19
    // Alternative 2: mit universellem Makro
20
    //        + Selektorvariable
21
    //        |   + Datentyp des Rückabewerts
22
    //        |   |        + Datentypen der Argumente
23
    //        |   |        |              + Funktionen
24
    //        |   |        |              |            + Argumente
25
    //        |  _|_  _____|____  ________|_________  _|__
26
    c = VCALL(i, int, (int, int), add, sub, mul, div)(a, b);
27
28
    // Alternative 3: mit spezialisiertem Makro
29
    c = VCALLI(i, add, sub, mul, div)(a, b);
30
31
    printf("%d\n", c);
32
  }
33
  return 0;
34
}

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 ;-)

von spess53 (Gast)


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

von Falk B. (falk)


Lesenswert?


von Falk B. (falk)


Lesenswert?

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

MEGALOL

von Paul Baumann (Gast)


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

von Klaus W. (mfgkw)


Lesenswert?

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

Wobei $ teilweise in Bezeichnern zulässig ist.

von Falk B. (falk)


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 . . . ;-)

von Klaus W. (mfgkw)


Angehängte Dateien:

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...

von Paul Baumann (Gast)


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

von Paul Baumann (Gast)


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

von Klaus W. (mfgkw)


Lesenswert?

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

von Yalu X. (yalu) (Moderator)


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?

von Klaus W. (mfgkw)


Lesenswert?


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.