Hi,
ich kämpfe gerade ein wenig mit C. Ich habe folgende Strukturen und
Variablen:
1 | typedef struct frameLayer_t {
|
2 | uint8_t LED_1:1;
|
3 | uint8_t LED_2:1;
|
4 | uint8_t LED_3:1;
|
5 | uint8_t LED_4:1;
|
6 | uint8_t LED_5:1;
|
7 | uint8_t LED_6:1;
|
8 | uint8_t LED_7:1;
|
9 | uint8_t LED_8:1;
|
10 | uint8_t LED_9:1;
|
11 | } frameLayer;
|
12 |
|
13 | typedef struct frame_t {
|
14 | frameLayer layer1;
|
15 | frameLayer layer2;
|
16 | frameLayer layer3;
|
17 | } frame;
|
18 |
|
19 | frame frame1;
|
20 | frame frame2;
|
21 | volatile frame *currentFrame = &frame1;
|
22 | volatile frame *nextFrame = &frame2;
|
Nun möchte ich an einer Stelle im Code jeweils nur auf eine Schicht
(=Layer) zugreifen. Die Schicht auf welche ich zugreifen möchte ist in
der Variablen "activeLayer" gespeichert, welche jeweils von null bis
zwei hochgezählt wird. Das Ganze ist Teil einer ISR zum Multiplexen von
LEDs. Zur Zeit mache ich das noch so:
1 | frameLayer activeFrameLayer;
|
2 |
|
3 | // Get address of activeLayer of currentFrame
|
4 | switch (activeLayer) {
|
5 |
|
6 | case 0:
|
7 | activeFrameLayer = currentFrame->layer1;
|
8 | break;
|
9 | case 1:
|
10 | activeFrameLayer = currentFrame->layer2;
|
11 | break;
|
12 | case 2:
|
13 | activeFrameLayer = currentFrame->layer3;
|
14 | break;
|
15 |
|
16 | }
|
Allerdings erscheint mir das unnötig kompliziert. Ist es irgendwie
möglich auf das switch Konstrukt zu verzichten und einfach mit
Pointer-Arithmetik (sowie Casting) zu arbeiten? Meine Versuche verliefen
bisher im Sande, unter anderem habe ich z.B. so etwas versucht:
Bin was C angeht leider kein Profi, aber hier treibt sich sicherlich der
ein oder andere herum ;).
Vielen Dank!