Nabend,
ich habe da eine Frage, wie initialisiert man einen flexiblen array
member zur Compilezeit ohne einen Roman zu schreiben?
Beispiel:
1
typedefstruct
2
{
3
constunsignedAnzahl;
4
uint8_tWerte[];
5
}Muster_t;
6
7
Muster_tMusterA={3,{0,0,0}};
8
Muster_tMusterB={1000,{...}};
In einfachen Fällen wie bei MusterA geht das ja noch, aber wenns mal
mehr wird wie bei MusterB...
Achja, natürlich könnte ich auch den Speicher per malloc reservieren,
nullen (bzw. calloc) und die Werte darauf umbiegen, aber das sollte doch
irgendwie einfacher gehen.
Oder muss ich wirklich ein Script basteln was mir z.B. 1000 Komma
separierte Nullen als String baut?
Und ja, mir ist schon klar, dass das statische Initialisieren von
flexiblen array membern eigentlich nicht funktionieren sollte, aber der
gcc macht da eh eine Ausnahme indem er den flexiblen member zu einem
statischen macht mit der Größe der Anzahl der Initialisierungswerte.
Was dann natürlich auch eine Möglichkeit wäre, indem man selber für jede
benötigte Größe des array member ein struct mit dem passenden statischen
array baut; mit dem Ergebnis, dass man dann eventuell einen ganzen Zoo
an structs hat.
Oder gibt es da noch eine andere Möglichkeit?
Ok, eine Möglichkeit wäre eventuell das Struct und das Array separat
anzulegen und nur drauf zu pointern:
Ein Skript, welches Dir Quellcode generiert? Oha, das klingt ziemlich
abenteuerlich ;)
Was spricht denn dagegen, dass Du Dir eine Setup-Funktion schreibst, die
das Array für Dich anhand der übergebenen Größe initialisiert?
Also statt
michi schrieb:> Ein Skript, welches Dir Quellcode generiert? Oha, das klingt ziemlich> abenteuerlich ;)
Noch nie eine diskrete Sinustabelle für die Verwendung in einem Array
generiert oder ähnliches?
> Was spricht denn dagegen, dass Du Dir eine Setup-Funktion schreibst, die> das Array für Dich anhand der übergebenen Größe initialisiert?>> Also statt>>
1
>Muster_tMusterA={3,{0,0,0}};
2
>
>> zum Beispiel so:>>
1
>Muster_tMusterA=setupMuster(3);
2
>
Versuch doch einfach mal, nur so ungefähr, dir die Funktionsweise der
setupMuster() Funktion zu überlegen...
michi schrieb:> Was spricht denn dagegen, dass Du Dir eine Setup-Funktion schreibst, die> das Array für Dich anhand der übergebenen Größe initialisiert?
Dagegen spricht, dass du nicht weißt, was ein flexible array member ist.
Schafft es der GCC, die Nullen wirklich zu Nullen oder kopiert er die?
Zudem ist es unschön, n manuell zu pflegen. Ich würde es separat machen.
Oder nur ein Array allokieren und die Struktur als Ptr darauf legen. Mit
"init"Funktion, die den ptr zurückgibt,
Tim T. schrieb:> Achja, natürlich könnte ich auch den Speicher per malloc reservieren,> nullen (bzw. calloc)
anders geht es auch nicht.
und die Länge des Arrays kann man in der Struktur erst ablegen, wenn der
Speicher für die Struktur (und das Array) reserviert wurde. Somit muss
man die Größe des Arrays vorher kennen.
> Somit muss man die Größe des Arrays vorher kennen.
"Dank" VLA ist das nicht mehr noetig.
Ich persoenlich wuerde das in Verbindung mit Controllern
aber nicht als Gewinn ansehen.
DPA schrieb:> Nö, c23 beschreibt immernoch überall, wie mit VLAs umzugehen ist. Sind> also noch da.
Ich weiß nicht, auf was Du Dich beziehst. Aber was ich oben geschrieben
habe, ist kein VLA, sondern ein array of unspecified size.
VLA kann man gar nicht initialisieren, sondern nur die Elemente
zuweisen.
ein lupenreiner Demokrat schrieb:> ... schrieb:>> "Dank" VLA>> haben nichts mit dem leeren Array am Strukturende zu tun und sind wieder> abgeschafft.
Nein, nicht abgeschafft, sondern optional.
ein lupenreiner Demokrat schrieb:> und die Länge des Arrays kann man in der Struktur erst ablegen, wenn der> Speicher für die Struktur (und das Array) reserviert wurde.