Hallo,
ich möchte wissen ob es möglich ist, mit Hilfe von sizeof (oder anders),
die Größe eines Abschnittes eines Arrays zu ermittlen? Um zu
verdeutlichen was ich meine:
PROGMEM prog_int16_t ledAnimSeq[] =
{
LED1,160,LED1,0,LED8,210,LED8,0,LED7,260,LED7,0,
LED8,210,LED8,0,LED1,160,LED1,0,LED2,210,LED2,0,LED3,260,LED3,0,
LED2,210,LED2,0,LED1,160,LED1,0,LED8,160,LED8,0,LED7,210,LED7,0,
LED7,210,LED7,0,LED8,160,LED8,0,LED1,160,LED1,0,LED2,160,LED2,0,
AbschnitAnfang:
LED6,210,LED6,0,LED5,260,LED5,0,
LED3,210,LED3,0,LED4,260,
LED3,110,LED2,110,LED1,110,LED8,110,LED7,110,LED6,110,LED5,110,//140
LED5,110,LED6,110,LED7,110,LED8,110,LED1,0,LED8,110,LED2,0,LED7,110,LED3
,0,
AbschnittEnde:
LED6,110,LED4,0,LED5,110,
LED5,110,LED6,110,LED7,110,LED8,110,LED1,110,LED2,110,LED3,110,LED4,110
};
größeAbschnitt = sizeof(AbschnittEnde-AbschnittAnfang); <-funktioniert
nicht!
Du hast diese Definition echt durch den COmpiler gebracht? Du siehst mich verblüfft. Ich kann mir nicht vorstellen, dass das so vom Standard gedeckt ist, dass man mitten in einer Definition ein Label setzen kann. Machs anders. definiere dir 3 Arrays. Dann kannst du von jedem einzelnen leicht die Anzahl der Einträge bestimmen.
...nein, ich habe diese Definition nicht durch den Compiler gebracht, sondern ich hätte diese Definition gerne durch den Compiler gebracht! Deine Lösung ist leider für mich suboptimal! Ich habe früher (lang ist's her) viel in C programmiert, und meine mich zu erinnern, dass es eine Möglichkeit (mit Hilfe von Markern) gibt, die Größe eines Array-Abschnittes zu bestimmen!? Vielleicht war es auch eine Compiler-spezifische Lösung!?
MichaDi schrieb: > ...nein, ich habe diese Definition nicht durch den Compiler gebracht, > sondern ich hätte diese Definition gerne durch den Compiler gebracht! > Deine Lösung ist leider für mich suboptimal! Warum? Das ist mehr oder weniger die Standardlösung, mit der man so etwas macht: Daten in mehrere Bereiche aufteilen. Ich weiß ja nicht was das ganze soll, aber ich rate mal es handelt sich um einen Prolog, einen zu wiederholenden Teil und einen Epilog
1 | PROGMEM prog_int16_t ledAnimSeqProlog[] = |
2 | {
|
3 | LED1,160,LED1,0,LED8,210,LED8,0,LED7,260,LED7,0, |
4 | LED8,210,LED8,0,LED1,160,LED1,0,LED2,210,LED2,0,LED3,260,LED3,0, |
5 | LED2,210,LED2,0,LED1,160,LED1,0,LED8,160,LED8,0,LED7,210,LED7,0, |
6 | LED7,210,LED7,0,LED8,160,LED8,0,LED1,160,LED1,0,LED2,160,LED2,0 |
7 | }
|
8 | |
9 | PROGMEM prog_int16_t ledAnimSeqBody[] = |
10 | {
|
11 | LED6,210,LED6,0,LED5,260,LED5,0, |
12 | LED3,210,LED3,0,LED4,260, |
13 | LED3,110,LED2,110,LED1,110,LED8,110,LED7,110,LED6,110,LED5,110,//140 |
14 | LED5,110,LED6,110,LED7,110,LED8,110,LED1,0,LED8,110,LED2,0,LED7,110,LED3,0 |
15 | }
|
16 | |
17 | PROGMEM prog_int16_t ledAnimSeqEpilog[] = |
18 | {
|
19 | LED6,110,LED4,0,LED5,110, |
20 | LED5,110,LED6,110,LED7,110,LED8,110,LED1,110,LED2,110,LED3,110,LED4,110 |
21 | };
|
22 | |
23 | #deine ARRAY_SIZE(x) ( sizeof(x) / sizeof(*x) )
|
24 | int main() |
25 | {
|
26 | |
27 | ...
|
28 | |
29 | showLeds( ledAnimSeqProlog, ARRAY_SIZE( ledAnimSeqProlog ) / 2 ); |
30 | |
31 | for( i = 0; i < 20; ++i ) |
32 | showLeds( ledAnimSeqBody, ARRAY_SIZE( ledAnimSeqBody ) / 2 ); |
33 | |
34 | showLeds( ledAnimSeqEpilog, ARRAY_SIZE( ledAnimSeqEpilog ) / 2 ); |
35 | |
36 | ...
|
Natürlich kann man das auch noch weiter treiben, indem man Prolog, Body und Epilog wieder in einer Struktur zusammenfast, mit Pointer auf die Daten. Ab dort stehen Tür und Tor offen. > Ich habe früher (lang ist's her) viel in C programmiert, und meine mich > zu erinnern, dass es eine Möglichkeit (mit Hilfe von Markern) gibt, die > Größe eines Array-Abschnittes zu bestimmen!? Nicht das ich wüsste.
MichaDi schrieb: > und meine mich zu erinnern, Wenn man erst mal die Zeiger oder Indices hat, dann kann man mit einfacher Subtraktion den Abstand ermitteln (gemessen in Anzahl der Elemente). Vielleicht hast du sowas im Kopf?
1 | prog_int16_t *ledAnimSeq_ptr1 = &ledAnimSeq[25]; |
2 | prog_int16_t *ledAnimSeq_ptr2 = ledAnimSeq+10; |
3 | |
4 | ... ledAnimSeq_ptr2 - ledAnimSeq_ptr1 ... // liefert 15 |
Eine Markierung in den Feldern bei der Definition gibt es aber nicht.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.