www.mikrocontroller.net

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


Autor: avrlover (Gast)
Datum:

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

Autor: Jean Player (fubu1000)
Datum:

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

Gruß

Autor: Ralf Schwarz (spacedog) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: avrlover (Gast)
Datum:

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

Autor: Ralf Schwarz (spacedog) Benutzerseite
Datum:

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

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: avrlover (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Compiler beschwert sich, das Array sei zu groß
bc.c: At top level:
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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm... naja. Muss man halt zwei Arrays verwenden und feddich :D

Autor: Stefan C. (jaecko)
Datum:

Bewertung
0 lesenswert
nicht 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]...

Autor: A. K. (prx)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.