Funktionspointer sind in C gängige Praxis und sehr effizient und
überhaupt nicht dreckig.
Hier mal ein Beispiel:
1 | typedef unsigned char u8;
|
2 |
|
3 | typedef u8 (*u8_fp_v)(void);
|
4 |
|
5 | extern u8 f0( void );
|
6 | extern u8 f1( void );
|
7 | extern u8 f2( void );
|
8 |
|
9 |
|
10 | u8_fp_v functions[] = { f0, f1, f2 };
|
11 |
|
12 |
|
13 | u8 call_nr( u8 nr )
|
14 | {
|
15 | if( nr >= sizeof(functions) / sizeof(u8_fp_v))
|
16 | return 0xFF; // out of table
|
17 |
|
18 | return functions[nr](); // execute function
|
19 | }
|
Die Funktionen f0..f2 geben hier eine Byte zurück, mit dem man den
Erfolg signalisieren kann.
Wird versehentlich ein Funktionsindex übergeben, der außerhalb der
Tabelle liegt, wird natürlich nichts ausgeführt, sondern 0xFF
zurückgegeben. Ist auch ein schönes Beispiel für den sizeof Operator.
Beim AVR-GCC gibt es noch einige Besonderheiten, wenn man die Tabelle
in den Flash-Bereich legen will.
Peter