Forum: Compiler & IDEs Problem mit __flash, struct und (vmtl) Pointern.
Hi,
ich versuche gerade eine kleine Ansteuerung für LEDs, eigentlich nichts
wildes. Da sich aber recht viele Muster ergeben, sollen diese alle mit
__flash abgelegt werden.
Die Struktur an sich habe ich mir folgendermaßen gedacht:
1 | light_patterns[] = [
| 2 | {
| 3 | light_pattern.nr_elements => int,
| 4 | light_pattern.rotate => int,
| 5 | light_pattern.lp_elements => [
| 6 | &pattern_element_1
| 7 | &pattern_element_2,
| 8 | &pattern_element_3
| 9 | ]
| 10 | },
| 11 | {
| 12 | light_pattern.nr_elements => int,
| 13 | light_pattern.rotate => int,
| 14 | light_pattern.lp_elements => [
| 15 | &pattern_element_2,
| 16 | &pattern_element_4,
| 17 | &pattern_element_2
| 18 | …
| 19 | ]
| 20 | }
| 21 | …
| 22 | ]
| 23 |
| 24 | pattern_element_1 = …
| 25 | pattern_element_2 = …
| 26 | …
|
Also grob gesagt ein Array, welches die verschiedenen Muster enthält.
Diese bestehen jeweils aus dem Parameter "rotate" sowie einem Array aus
Pointern auf die einzelnen "Leuchtzustände" (da sich diese in
verschiedenen Pattern wiederholen können) sowie der Anzahl der
pattern_element, da diese nicht gleich sein müssen.
Nun habe ich versucht das ganze von innen nach außen aufzubauen, aber
ich bekomme die einzelnen pattern_element nicht sauber ins Array im
light_pattern. Nach diversem ratlosen rumprobieren stehe ich gerade da
mit:
1 | #ifndef _PATTERNS_H
| 2 | #define _PATTERNS_H
| 3 |
| 4 | typedef const __flash struct {
| 5 | const uint8_t l12;
| 6 | const uint8_t l34;
| 7 | const uint8_t duration;
| 8 | } pattern_element;
| 9 |
| 10 | typedef const __flash struct {
| 11 | const uint8_t nr_elements;
| 12 | const uint8_t rotate;
| 13 | const __flash pattern_element *lp_elements[];
| 14 | } light_pattern;
| 15 |
| 16 | const __flash pattern_element lpe_4444_30 = { 0x44, 0x44, 30 };
| 17 | const __flash pattern_element lpe_0000_30 = { 0x00, 0x00, 30 };
| 18 | const __flash pattern_element lpe_0000_200 = { 0x00, 0x00, 200 };
| 19 |
| 20 | const __flash pattern_element * const __flash lp_elements_dualflash[] = {
| 21 | &lpe_4444_30, &lpe_0000_30,
| 22 | &lpe_4444_30, &lpe_0000_30,
| 23 | &lpe_0000_200
| 24 | };
| 25 |
| 26 | const __flash light_pattern lp_dualflash = { 5, 1, &lp_elements_dualflash };
| 27 |
| 28 | #endif //_PATTERNS_H
|
Und dem Fehler:
1 | Compiling C: main.c
| 2 | avr-gcc -c -mmcu=attiny2313 -I. -gdwarf-2 -DF_CPU=8000000UL -DUART_RX_BUFFER_SIZE=32 -DUART_TX_BUFFER_SIZE=32 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -Wall -Wextra -Wpedantic -Wstrict-prototypes -Wa,-adhlns=./main.lst -std=gnu99 -Wundef -MMD -MP -MF .dep/main.o.d main.c -o main.o
| 3 | In file included from main.c:6:0:
| 4 | patterns.h:26:1: warning: missing braces around initializer [-Wmissing-braces]
| 5 | const __flash light_pattern lp_dualflash = { 5, 1, &lp_elements_dualflash };
| 6 | ^
| 7 | patterns.h:26:1: warning: (near initialization for ‘lp_dualflash.lp_elements’) [-Wmissing-braces]
| 8 | patterns.h:26:1: warning: initialization from incompatible pointer type [enabled by default]
| 9 | patterns.h:26:1: warning: (near initialization for ‘lp_dualflash.lp_elements[0]’) [enabled by default]
| 10 | patterns.h:26:1: warning: initialization of a flexible array member [-Wpedantic]
| 11 | patterns.h:26:1: warning: (near initialization for ‘lp_dualflash.lp_elements’) [-Wpedantic]
|
Grüße
Moritz
1 | const __flash pattern_element *lp_elements[];
|
Hier ist das [] falsch. Lasse das weg, und die Fehler sollten
verschwinden.
Hatte ich auch schon getestet, aber so ganz mag er den Pointer immer
noch nicht:
1 | In file included from main.c:6:0:
| 2 | patterns.h:26:1: warning: initialization from incompatible pointer type [enabled by default]
| 3 | const __flash light_pattern lp_dualflash = { 5, 1, &lp_elements_dualflash };
| 4 | ^
| 5 | patterns.h:26:1: warning: (near initialization for ‘lp_dualflash.lp_elements’) [enabled by default]
|
Daher war mein erster Verdacht, dass da irgendeine Typüberprüfung
zuschlägt bezüglich Pointer auf einzelnes Element oder Arrayanfang,
weshalb ich die [] im struct ergänzte.
1 | const __flash pattern_element **lp_elements;
|
1 | const __flash light_pattern lp_dualflash = { 5, 1, &lp_elements_dualflash };
| 2 | ^
| 3 | patterns.h:26:1: warning: (near initialization for ‘lp_dualflash.lp_elements’) [enabled by default]
| 4 | patterns.h:26:1: error: initializer element is not computable at load time
| 5 | patterns.h:26:1: error: (near initialization for ‘lp_dualflash.lp_elements’)
| 6 | patterns.h:26:1: warning: missing initializer for field ‘lp_elements’ of ‘light_pattern’ [-Wmissing-field-initializers]
| 7 | patterns.h:13:37: note: ‘lp_elements’ declared here
| 8 | const __flash pattern_element **lp_elements;
| 9 | ^
|
1 | const __flash pattern_element * const __flash *lp_elements;
|
kompiliert wieder durch, aber:
1 | In file included from main.c:6:0:
| 2 | patterns.h:26:1: warning: initialization from incompatible pointer type [enabled by default]
| 3 | const __flash light_pattern lp_dualflash = { 5, 1, &lp_elements_dualflash };
| 4 | ^
| 5 | patterns.h:26:1: warning: (near initialization for ‘lp_dualflash.lp_elements’) [enabled by default]
|
Aber behoben hat es dann ein 1 | const __flash pattern_element * const __flash (*lp_elements)[];
|
Insofern schonmal ein großes Danke für deine Hilfe!
Wo ich es so betrachte, eigentlich müsste der Schritt über
lp_elements_dualflash[]
doch auch umgehbar sein, dass ich direkt im Struct das Pointerarray
anstatt dem Pointer aufs Pointerarray habe.
EDIT: Quatsch, das hat ja keine feste Länge.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|