Forum: Mikrocontroller und Digitale Elektronik Arduino Strukturen Array imProgmem


von amle (Gast)


Lesenswert?

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.
1
typedef struct pixel_type {
2
  uint8_t R;              
3
  uint8_t G;              
4
  uint8_t B;               
5
  uint8_t V;            
6
};
7
8
typedef struct pattern_type { 
9
  pixel_type *Pixels[];  // soltle Pointer sein
10
  uint8_t Britghness;     
11
  bool bFullsize;         
12
};
13
14
const pattern_type Data[] PROGMEM =  {
15
{{255,0,0,10},{255,0,0,55},{255,0,0,10}},25,false,
16
{{255,0,0,10},{255,0,0,55}},25,false
17
};
18
19
struct pattern_type **Patterns = &Data;

: Verschoben durch User
von Arduinoquäler (Gast)


Lesenswert?

Berichte doch erst mal woran es scheitert.

Sonst müssen wir Rätsel raten.

von amle (Gast)


Lesenswert?

Ich erhalte immer einen Fehler, da die Pointer Definitionen nicht 
stimmen.

von amle (Gast)


Lesenswert?

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

von Arduinoquäler (Gast)


Lesenswert?

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.

von amle (Gast)


Lesenswert?

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.

von amle (Gast)


Lesenswert?

Zur Info: Ich benutze Arduino for Visual Studio

von fürn huge (Gast)


Lesenswert?

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

von amle (Gast)


Lesenswert?

JO danke, genau drum frag ich hier ja, weil ich nicht weiss wie
oder ist das als Witz zu verstehen?

von Einer K. (Gast)


Lesenswert?

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.

von amle (Gast)


Lesenswert?

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.

von Einer K. (Gast)


Lesenswert?

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()

von amle (Gast)


Lesenswert?

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.

von Einer K. (Gast)


Lesenswert?


von fürn hugo (Gast)


Lesenswert?

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

von Daniel A. (daniel-a)


Lesenswert?

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:
1
> gcc -x c -std=c99 -Wall -Wextra -Werror -pedantic - -c -o out
2
#include <stdint.h>
3
#include <stdbool.h>
4
5
typedef struct pixel_type {
6
  uint8_t R;              
7
  uint8_t G;              
8
  uint8_t B;               
9
  uint8_t V;            
10
} pixel_type;
11
12
typedef struct pattern_type { 
13
  pixel_type *Pixels[];  // soltle Pointer sein
14
  uint8_t Britghness;     
15
  bool bFullsize;         
16
};
17
<stdin>:12:15: error: flexible array member not at end of struct
18
<stdin>:15:1: error: useless storage class specifier in empty declaration [-Werror]
19
cc1: all warnings being treated as errors

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:
1
#include <stdint.h>
2
#include <stdbool.h>
3
4
typedef struct pixel_type {
5
  uint8_t R;              
6
  uint8_t G;              
7
  uint8_t B;               
8
  uint8_t V;            
9
} pixel_type;
10
11
typedef struct pattern_type { 
12
  const pixel_type (*Pixels)[];
13
  uint8_t Britghness;     
14
  bool bFullsize;         
15
} pattern_type;
16
17
const pattern_type Data[] = {
18
  {&(const pixel_type[]){{255,0,0,10},{255,0,0,55},{255,0,0,10}},25,false},
19
  {&(const pixel_type[]){{255,0,0,10},{255,0,0,55}},25,false}
20
};
Oder:
1
#include <stdint.h>
2
#include <stdbool.h>
3
4
typedef struct pixel_type {
5
  uint8_t R;              
6
  uint8_t G;              
7
  uint8_t B;               
8
  uint8_t V;            
9
} pixel_type;
10
11
typedef struct pattern_type { 
12
  const pixel_type *Pixels;
13
  uint8_t Britghness;     
14
  bool bFullsize;         
15
} pattern_type;
16
17
const pattern_type Data[] = {
18
  {(const pixel_type[]){{255,0,0,10},{255,0,0,55},{255,0,0,10}},25,false},
19
  {(const pixel_type[]){{255,0,0,10},{255,0,0,55}},25,false}
20
};

Fehlt nurnoch das PROGMEM oder ein __flash an den richtigen stellen.

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.