Flash Konstanten eleganter initialisieren

Gast #5603752
Lesenswert?

Hallo,

ich benutze einen C8051 und möchte beispielsweise von einem struct ganz 
viele Variablen als Konstante in den Flash legen.
1
typedef struct{
2
  uint8_t u8Nummer;
3
} s_Test;
4

5
code s_Test data[100];

Gibt es nun einen eleganteren Welt als den folgenden?
1
code s_Test data[] = {
2
 0,1,2,3,[...],99
3
};

Im Sinne von
1
code s_Test data[0] = {0};
2
code s_Test data[1] = {1};

Danke!
#5603780
Lesenswert?

@ Walter (Gast)

>ich benutze einen C8051 und möchte beispielsweise von einem struct ganz
>viele Variablen als Konstante in den Flash legen.
>typedef struct{
>  uint8_t u8Nummer;
>} s_Test;

Schechtes Beispiel, ein Struct mit nur einer Variabel ist sinnlos.

>code s_Test data[100];

>Gibt es nun einen eleganteren Welt als den folgenden?
>code s_Test data[] = {
> 0,1,2,3,[...],99
>};

Das IST der elegante Weg!

>Im Sinne von
>code s_Test data[0] = {0};
>code s_Test data[1] = {1};

Das ist der naive Anfängerweg.
#5603785
Lesenswert?

Die Initialisierung einer Konstanten muss ein in sich geschlossenes 
Statement sein - ansonsten wäre es keine Konstante sondern eine Variable 
(und muss in einem RAM liegen).

Ansonsten gäbe es Möglichkeiten das etwas aufzuhübschen, etwa mit 
sprechenden Member Namen der Struct.
#5603795
Lesenswert?

Ich kenne auch folgendes, das könnte aber eine GCC Extension sein, die 
nicht auf jedem 8051 Compiler tun muss:
1
typedef struct{
2
  uint8_t foo;
3
  uint8_t bar;
4
} s_Test;
5

6
code s_Test  = {
7
  .bar = 0x01,
8
  .foo =  0x02,
9
};

Funktioniert aber nicht mit Arrays, die müsste man wie immer als 
{0,1,2,3,..} angeben.
Gast #5603803
Lesenswert?

Jim M. schrieb:
> Ich kenne auch folgendes, das könnte aber eine GCC Extension sein

6.27 Designated Initializers
https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
1
Standard C90 requires the elements of an initializer to appear in a fixed 
2
order, the same as the order of the elements in the array or structure 
3
being initialized.
4

5
In ISO C99 you can give the elements in any order, specifying the array 
6
indices or structure field names they apply to, and GNU C allows this as 
7
an extension in C90 mode as well.
Persönliche Seite #5603809
Lesenswert?

Struktur-Arrays lassen sich wie folgt initialisieren:
1
typedef struct
2
{
3
  uint8_t foo;
4
  uint8_t bar;
5
} s_Test;
6

7
code s_Test testarray[] = 
8
{
9
  { 1, 2 },
10
  { 1, 0 },
11
  { 2, 1 }
12
};

Zwar kann man die Klammern um die Einzelstrukturen auch weglassen, das 
aber wird schnell unübersichtlich.

Die C99-Initialisierung sollte sich wie folgt anwenden lassen können:
1
code s_Test testarray[] = 
2
{
3
  { 
4
  .bar = 1,
5
  .foo = 2
6
  },
7
  {
8
  .bar = 1,
9
  .foo = 0
10
  },
11
  {
12
  .bar = 2,
13
  .foo = 1
14
  }
15
};

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren