Das Initialisieren mit {} geht nur beim Initialisieren, daher der Name.
Eine spätere Zuweisung geht wie gesagt nicht mit {}.
Falls du aber die Zuweisungen nicht vollkommen willkürlich durcheinander
machen musst, sondern beispielsweise zwischen einigen wenigen, vorher
bekannten Konfigurationen umschalten willst, kannst du dir diese
Konfigurationen in je einem Feld von Zeigern ablegen.
Zum Umschalten gibt es dann zwei Möglichkeiten:
- in dein eigentliches Feld, über das gesprungen wird, jeweils
eines der vorkonfigurierten umkopieren, oder
- das Springen über eine weitere Indirektion machen, also einen
neuen Zeiger auf das jeweils aktuelle Feld mit den Konfigurationen
richten und darüber und einen Zeiger darin springen.
Beispiel:1 | #include <stdlib.h>
|
2 | #include <stddef.h>
|
3 | #include <stdio.h>
|
4 |
|
5 | #define MAXKEYS 2
|
6 |
|
7 | typedef void (*keyfunction_t)(void);
|
8 |
|
9 | void set1(void);
|
10 | void set2(void);
|
11 |
|
12 | void set1(void)
|
13 | {
|
14 | printf( "ich bin set1\n" );
|
15 | }
|
16 |
|
17 | void set2(void)
|
18 | {
|
19 | printf( "ich bin set2\n" );
|
20 | }
|
21 |
|
22 |
|
23 |
|
24 | // mehrere Zeigertabellen:
|
25 | keyfunction_t key_call_Konfiguration_Vollmond[MAXKEYS]={ &set1, &set2 };
|
26 | keyfunction_t key_call_Konfiguration_Neumond [MAXKEYS]={ &set2, &set1 };
|
27 |
|
28 | // die jeweils aktuelle Tabelle:
|
29 | keyfunction_t *p_key_call_Konfiguration_aktuell = key_call_Konfiguration_Vollmond;
|
30 |
|
31 |
|
32 | // ruft zur Demo alle Funktionen der aktuellen Tabelle auf
|
33 | void tuwas()
|
34 | {
|
35 | // Aufruf der Funktionen der aktuellen Tabelle über
|
36 | // p_key_call_Konfiguration_aktuell, um in das richtige Feld zu
|
37 | // kommen und darin über Index [0] oder [1]
|
38 | p_key_call_Konfiguration_aktuell[0]();
|
39 | p_key_call_Konfiguration_aktuell[1]();
|
40 | }
|
41 |
|
42 |
|
43 | int main( int nargs, char **args )
|
44 | {
|
45 | printf( "jetzt ist Neumond:\n" );
|
46 | p_key_call_Konfiguration_aktuell = key_call_Konfiguration_Vollmond;
|
47 | tuwas();
|
48 |
|
49 | printf( "jetzt ist Vollmond:\n" );
|
50 | p_key_call_Konfiguration_aktuell = key_call_Konfiguration_Neumond;
|
51 | tuwas();
|
52 |
|
53 | return 0;
|
54 | }
|
Egal, wieviele Einträge in dem Feld jeweils stehen, muss beim
Umschalten nur ein Zeiger umgesetzt werden.
Das ist zum einen schnell und zum zweiten sogar atomar.