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


von Bert (Gast)


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.

von Uhu U. (uhu)


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.

von Rolf Magnus (Gast)


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?

von Stefan (Gast)


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

von hulou (Gast)


Lesenswert?

nimm malloc und free

von Uhu U. (uhu)


Lesenswert?

Bert:

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

von Michael Z (Gast)


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.

von Andreas K. (a-k)


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.

von Uhu U. (uhu)


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

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Was spricht denn gegen
1
void
2
foo(int len)
3
{
4
    char array[len];
5
    /* something very usefull */
6
}

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

von Andreas K. (a-k)


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.

von Bert (Gast)


Lesenswert?

genau,

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

von Patrick D. (oldbug) Benutzerseite


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 ;-)
1
void
2
foo(int len)
3
{
4
  static char array[len];
5
}
1
main.c: In function 'foo':
2
main.c:15: error: storage size of 'array' isn't constant

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

von Andreas K. (a-k)


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.

von Patrick D. (oldbug) Benutzerseite


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.

von Rolf Magnus (Gast)


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?

von Andreas K. (a-k)


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.

von Andreas K. (a-k)


Lesenswert?

Rolf Magnus wrote:

> avr? Wo steht denn was von avr?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Andreas K. (a-k)


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.

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.