Forum: Compiler & IDEs Maximale Array Größe beim Avrgcc?


von avrlover (Gast)


Lesenswert?

Hi,
wie groß dürfen denn Arrays beim avr-gcc werden?

von Jean P. (fubu1000)


Lesenswert?

Also soweit ich weiß ist die Array Größe durch "int" begrenzt.

Gruß

von Ralf S. (spacedog) Benutzerseite


Lesenswert?

Theoretische Antwort: Die Grösse eines Arrays dürfte in C eigentlich nur 
vom verfügbaren Speicher abhängen und schlimmstenfalls noch von den 
Adressierungsgepflogenheiten der Zielarchitektur.

Praxisbezogene Antwort: Keine Ahnung, ich war mit Arrays noch nie dort, 
wo die Grösse nicht mehr reichte. Probier's halt aus und schau, welches 
die begrenzenden Faktoren sind.

Schlaumeierische Antwort: Wenn die Datenmenge gross wird, kommt der 
Zeitpunkt, wo malloc nützlich wird. Memoryleaks, seid willkommen!

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Je nachdem wieviel Ressourcen Dir dein AVR bietet. Wenn Du Dein Array im 
SRAM ablegst ist es durch die Groesse des SRAMs abzueglich dem, was Du 
sonst noch brauchst (z.B. Stack) begrenzt. Andernfalls begrenzt durch 
die Groesse des verwendeten Speichers.

von avrlover (Gast)


Lesenswert?

Ich hab es mit PROGMEM im Flash abgelegt. Aber der Compiler beschwert 
sich darüber das es zu groß ist

von Ralf S. (spacedog) Benutzerseite


Lesenswert?

Und weiter? Wie gross ist dein Array, wie gross ist dein Flash und was 
ist da sonst noch so alles drin?

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

avrlover wrote:
> Ich hab es mit PROGMEM im Flash abgelegt. Aber der Compiler beschwert
> sich darüber das es zu groß ist

Code und literare Fehlermeldung, dann kann man eventuell was dazu sagen. 
Mit pauschalen Aussagen kann keiner was anfangen.

von (prx) A. K. (prx)


Lesenswert?

Da die Adress/Indexrechnung in 16 Bit mit Vorzeichen durchgeführt wird, 
kann ein Array nicht grösser werden als 32767 Bytes. Egal ob in RAM oder 
ROM.

von avrlover (Gast)


Lesenswert?

Der Compiler beschwert sich, das Array sei zu groß
1
bc.c: At top level:
2
bc.c:3683: error: size of array is too large

Das Array ist etwas über 32800 Byte groß. Wenn der Array Index signed 
int sein kann ist, wie A. K. gesagt hat, bei 32767 Byte schluss

von (prx) A. K. (prx)


Lesenswert?

Wer den Grund dafür nachvollziehen will: Die Berechnung der Differenz 
zweier Adressen wie in:
  basetype_t *p, *q;
  ptrdiff_t delta = p - q;
darf man sich intern so vorstellen:
  ptrdiff_t delta = (char *)p - (char *)q;
  delta /= sizeof(basetype_t);
Und ptrdiff_t ist notwendigerweise vorzeichenbehaftet. Wenn das ein 
16bit int ist, landet man zwanglos bei einem Limit von 32767, auch dann 
wenn basetype_t kein char ist.

Und wer sich fragt, warum das Limit nicht 32768 ist: Bei einem array[N] 
existiert zwar keine Element array[N], aber für dessen Adresse muss
  &array[0..N-1] < &array[N]
gelten.

von (prx) A. K. (prx)


Lesenswert?

Abhilfe, allgemeine Form: Statt
  basetype_t array[N];
mit N%K==0 verwendet man
  basetype_t array1[N/K], array2[N/K], ... arrayK[N/K];
  basetype_t array[K] = { array1, array2, ... arrayK };
und teilt den Index entsprechend auf:
  array[i/(N/K)][i%(N/K)]
was man in einem Makro verstecken kann.

In der Praxis sollte man statt mit einer teuren Division allerdings mit 
Subtraktion arbeiten.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Hm... naja. Muss man halt zwei Arrays verwenden und feddich :D

von Stefan C. (jaecko)


Lesenswert?

Ich geh mal davon aus, diese 32768 Bytes beziehen sich auf den Array 
allgemein, also unabhängig, wie viele "Dimensionen" ich hab...
d.h. array1[32768] geht nicht und array2[1024][32] geht ebensowenig wie 
array3[32][32][32]...

von (prx) A. K. (prx)


Lesenswert?

Yep, Tippfehler. Korrekt ist
  basetype_t *array[K] = { array1, array2, ... arrayK };
dann geht's.

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.