www.mikrocontroller.net

Forum: Compiler & IDEs Dynamisches Ändern der Größe von Arrays


Autor: Bert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

das Problem: zur Laufzeit soll die Größe eines Arrays geändert werden 
können.

Der Compiler meint aber dazu, dass ein Array eine konstante Länge haben 
muss.

Ein "alloc" und Co. kann ich nicht verwenden, da nicht unterstützt.

Gibts noch weitere Möglichkeiten?

Das Array sitzt in einer Funktion der die Array-Länge bei Aufruf 
zugewiesen wird.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein.

Beim Einsatz auf kleinen µC wäre das auch keine gute Idee, da auf diesem 
Weg mit einem Schlag alle Sicherheitsprobleme, die mit dynamischer 
Speicherverwaltung verbunden sind, in die Anwendung eingebaut würden.

Es bleibt nur, die maximal benötige Größe zu bestimmen und den Speicher 
fest zu reservieren.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Der Compiler meint aber dazu, dass ein Array eine konstante Länge haben
> muss.

Da hat er recht, der Compiler.

> Das Array sitzt in einer Funktion der die Array-Länge bei Aufruf
> zugewiesen wird.

Und warum muß die zur Laufzeit geändert werden?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht einfach die maximale Größe reservieren. Damit müsste er ja im 
worst case auch umgehen könnne. Also sollte das Programm damit laufen, 
auch wenn es sich erst mal nach Verschwendung anhört (ich denke es wird 
bestimmt ein globales Array?).

Autor: hulou (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nimm malloc und free

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bert:

> Ein "alloc" und Co. kann ich nicht verwenden, da nicht unterstützt.

Autor: Michael Z (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für einfache Variablen oder Instanzen kann man sich malloc und free 
selber per makro implementieren. Was fehlt, ist eine Unterstützung für 
generische Parameter & signaturen.

Einfach mal hier oder beim englischen Forum suchen, da gibt es Tricks 
dazu.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einzelne Umgebungen (lies: GCC-basierend) unterstützen eine dynamische 
Allokation auf dem Stack. Nennt sich alloca(). In diesem Fall ist es 
einfach und die Nebenwirkungen sind überschaubar.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Für einfache Variablen oder Instanzen kann man sich malloc und free
> selber per makro implementieren.

Das ist reine Augenwischerei:

Macros werden noch vor der eigentlichen Übersetzung vom Preprozesser 
abgearbeitet. Daraus folgt: Es handelt sich um reine 
Textersetzungsoperationen; Macroparameter werden textuell im Macrorumpf 
substituiert.

Ein Macro kann keine Heapverwaltung implementieren. Was man mit einem 
Macro malloc erreichen kann, das kann man auch direkt dort hinschreiben, 
wo der Macro expandiert würde: eine Variablendefinition.

free als Macro? das geht ganz einfach nicht...

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was spricht denn gegen
void
foo(int len)
{
    char array[len];
    /* something very usefull */
}

...wenn sonst keine dynamische Speicherverwaltung verfügbar ist?
Sicher gibt's gerade dabei Stolperstellen, aber bis er darauf gekommen 
ist, dass es zu 99% auch ohne geht, sollte das doch weiterhelfen!?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dagegen spricht erstens, dass dies erst mit C99 möglich ist, mit C89 
noch nicht. Und viele Compiler im Controller-Umfeld tun sich mit C99 
etwas schwer.

Zweitens wird Bert wohl genau dies probiert haben, der Meldung nach zu 
schliessen.

Autor: Bert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
genau,

und ich werde es daher als maximale Größe auslegen und fertig.

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Kaiser wrote:
> Dagegen spricht erstens, dass dies erst mit C99 möglich ist, mit C89
> noch nicht. Und viele Compiler im Controller-Umfeld tun sich mit C99
> etwas schwer.
>

Aha, ich muss also in einem GCC-Forum davon ausgehen, dass es sich um 
einen Compiler handelt, der die Features eines GCC-Compilers nicht 
unterstützt?

> Zweitens wird Bert wohl genau dies probiert haben, der Meldung nach zu
> schliessen.

Hat Dir das die Glaskugel verraten?
Meine hat mir gesagt, dass er eben 'static' vor 'char' verwendet hat ;-)
void
foo(int len)
{
  static char array[len];
}
main.c: In function 'foo':
main.c:15: error: storage size of 'array' isn't constant

Danke an Bert, dass er das aufgeklärt hat!

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Aha, ich muss also in einem GCC-Forum davon ausgehen, dass es sich um
> einen Compiler handelt, der die Features eines GCC-Compilers nicht
> unterstützt?

Sein Text:

> Ein "alloc" und Co. kann ich nicht verwenden, da nicht unterstützt.

sprach gegen GCC. Denn GCC kann alloca und die avr-libc hat malloc/free.

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Kaiser wrote:
>> Aha, ich muss also in einem GCC-Forum davon ausgehen, dass es sich um
>> einen Compiler handelt, der die Features eines GCC-Compilers nicht
>> unterstützt?
>
> Sein Text:
>
>> Ein "alloc" und Co. kann ich nicht verwenden, da nicht unterstützt.
>
> sprach gegen GCC. Denn GCC kann alloca und die avr-libc hat malloc/free.

Das spricht lediglich gegen die verwendete libc, aber sei's d'rum.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Denn GCC kann alloca

Wenn die libc es unterstützt.

> und die avr-libc hat malloc/free.

avr? Wo steht denn was von avr?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Denn GCC kann alloca
>
> Wenn die libc es unterstützt.

Wenn du ein
 #define alloca(size) __builtin_alloca(size)
als libc ansiehst, ja. Bis auf den Namen ist die Funktionalität von 
alloca() bei GCC allerdings ziemlich zwangsläufig Sache des Compilers, 
nicht der Library. Auch bei manchen anderen Compilern.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus wrote:

> avr? Wo steht denn was von avr?

Ok. Gibt es ein leidlich gängiges GCC Paket ohne malloc?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Kaiser wrote:

> Bis auf den Namen ist die Funktionalität von
> alloca() bei GCC allerdings ziemlich zwangsläufig Sache des Compilers,
> nicht der Library. Auch bei manchen anderen Compilern.

Das ist eigentlich zwangsläufig der Fall.  Die Bibliothek hat ja keinen
Einfluss auf den Funktionsepilog, den der Compiler generiert, genau
der muss aber bei alloc() das Aufräumen organisieren.  Das kann also
nur im Compiler passieren.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das ist eigentlich zwangsläufig der Fall.  Die Bibliothek hat ja keinen
> Einfluss auf den Funktionsepilog, den der Compiler generiert, genau
> der muss aber bei alloc() das Aufräumen organisieren.  Das kann also
> nur im Compiler passieren.

Wenn ein Compiler stets mit getrenntem Stack- und Frame-Pointer 
arbeitet, geht es auch ohne Compiler-Support. So war alloca() 
ursprünglich entstanden. Nur ist das mittlerweile aus der Mode gekommen.

Walter Bright (Digital Mars) beispielsweise implementiert alloca() als 
Lib-Funktion, scheint es aber im Compiler doch irgendwie zu kennen, denn 
es erzwingt den vollen Stack-Frame.

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.