Flash Konstanten eleganter initialisieren

Gast #5603752
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!
@ 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.
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.
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
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
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

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.