Ich möchte gerne einen Lot von Daten (Led[n] als Muster) mit einer
bestimmten Struktur im Programspeicher definiere. Und zwar so, das
einzelne Muster neu definiert werden können. Anzahl Leds sind variable,
genauso die Anzahl der Muster. Die Daten sollte im Programmmemory
definiert werden nicht im Ram.
Leider hab ich irgendwie ein Knopf in meiner Leitung und finde die
Lösung nicht wie ich das zu definieren hab.
error: too many initializers for 'pixel_type [0]
error: braces around scalar initializer for type 'uint8_t {aka unsigned
char}
error: cannot convert 'const pattern_type (*)[1]' to 'pattern_type**' in
initialization
struct pattern_type **Patterns = &Data
Error compiling .ino source
amle schrieb:> error: too many initializers for 'pixel_type [0]>> error: braces around scalar initializer for type 'uint8_t {aka unsigned> char}>> error: cannot convert 'const pattern_type (*)[1]' to 'pattern_type**' in> initialization> struct pattern_type **Patterns = &Data> Error compiling .ino source
So ist das zu umständlich. Bitte zeige dein ganzes Programm
(in Minimal-Version) und die Fehlermeldungen dazu.
Das ist bis jetzt das ganze Programm, sorry.
Ich hab mal die Typen definiert und will nun die Daten im PROGMEM
definieren, damit ich, wie man am schluss des codes sieht, eine Varibale
mit den konstanen definieren kann. die einzelnen muster kann man dann ja
mit new oder malloc neu definieren, da es ja pointer sein sollten.
Wieso behebst du nicht die error messages, steht eh da was nicht passt.
error: too many initializers for 'pixel_type [0]
Das ist ein pointer array! Dann muss es auch mit Zeiger initialisiert
werden!
error: braces around scalar initializer for type 'uint8_t {aka unsigned
char}
Das wird sich vermutlich dann auch erledigt haben.
error: cannot convert 'const pattern_type (*)[1]' to 'pattern_type**' in
initialization
struct pattern_type **Patterns = &Data
struct pattern_type const **Paterns! Wenn es ein zeiger auf const ist
dann sollte man auch const hinschreiben!
Error compiling .ino source
Es macht keinen Sinn, ein PointerArray ins Flash zu legen, wenn du doch
die Speicherbereiche, per malloc(), erst später erschaffen willst.
Wobei malloc() und seine Brüder, bei ungeschickter Verwendung, durchaus
verblüffende Probleme verursachen können.
Die Idee ist, ein DEFAULT Muster Tabelle zu hinterlegen.
Als 2. Schritt sollte offen sein, dass man diese Muster ändern kann.
Da diese später auch via Eingabe erfolgen können, muss ja dann Speicher
reserviert werden (malloc). Also sollte das Muster-Array, mit allen
Mustern, erweiterbar sein.
Das einfache "Umsetzen" eines Zeigers wird dir nicht helfen, da Flash
Daten nach einem anderen Verfahren gelesen werden wollen, als Daten aus
dem Ram.
Leider ist dem Zeiger der Unterschied nicht anzusehen. Die Info muss
also zusätzlich mitgeführt werden.
Tipp:
Lege sofort einen fixen Datenbereich an.
Fülle diesen mit der Vorbesetzung.
Verzichte auf malloc()
Gibt's dafür evtl. ein Beispiel wie man das am besten mach mit den
Strukturen? Genau dort hapert's eben auch.
Ich kann das auch mit 2 Tabellen lösen, denke ich. Eine feste und eine
Variable. Was ich dann beim Muster auswählen halt unterscheide.
>Das einfache "Umsetzen" eines Zeigers wird dir nicht helfen, da Flash>Daten nach einem anderen Verfahren gelesen werden wollen, als Daten aus>dem Ram.
Blödsinn, sicher geht das. In das normale Programm Flash werden auch
alle const Daten gelegt und es wird darauf gleich zugegriffen, genauso
wie der Befehlscode von dort geholt wird. Wenn wenig RAM und viel Flash
zur Verfügung steht macht es auf Sinn Daten als const zu deklarieren.
Entferne einfach den * bei:
typedef struct pattern_type {
pixel_type *Pixels[]; // soltle Pointer sein
uint8_t Britghness;
bool bFullsize;
};
Du brauchst da keine Pointer. Ob du die Daten aus den Ram oder Flash
holst kannst du dann in einer Funktion festlegen.
Also "pixel_type *Pixels[]" ist doch ein variable size array welches
Elemente vom Type Pointer auf pixel_type hat. Aber variable size arrays
sind doch nur am ende eines Strukts erlaubt, eigent lich müsste das ein
fehler geben:
Und bei "const pattern_type Data[]" fällt die verwendung von "flexible
array member"n schonmal flach.
Du brauchst ein Pointer auf ein Array, oder einfach nur einen Pointer +
compbound literale: