Forum: Mikrocontroller und Digitale Elektronik Flash Konstanten eleganter initialisieren


von Walter (Gast)


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!

von Falk B. (falk)


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.

von Jim M. (turboj)


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.

von Michael B. (laberkopp)


Lesenswert?

Walter schrieb:
> Variablen als Konstante

Als was nun, konstant oder variabel ?

Walter schrieb:
> Gibt es nun einen eleganteren Welt als den folgenden?

Der ist doch sehr elegant, extrem wenig arbeitsaufwändig, und wird mit 
dem Programm gleich mit reinprogrammiert. Was will man mehr ?

Trollfrage ?

von Jim M. (turboj)


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.

von Eric B. (beric)


Lesenswert?

Falk B. schrieb:
>>Gibt es nun einen eleganteren Welt als den folgenden?
>>code s_Test data[] = {
>> 0,1,2,3,[...],99
>>};
>
> Das IST der elegante Weg!

Sollte das nicht eigentlich
1
code s_Test data[] = {
2
  {0}, {1}, {2}, ... {99}
3
};
sein?

von Kaj (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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
};

von Johnny B. (johnnyb)


Lesenswert?

Jim M. schrieb:
> Funktioniert aber nicht mit Arrays

Doch das geht auch mit Arrays, musst die einzelnen Elemente einfach 
nochmals in geschweifte Klammern kapseln.

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.