Forum: Compiler & IDEs Größe eines Array-Abschnittes ermitteln


von MichaDi (Gast)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

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.

von MichaDi (Gast)


Lesenswert?

...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!?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

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
Noch kein Account? Hier anmelden.