www.mikrocontroller.net

Forum: Compiler & IDEs Frage zum C-Präprozessor


Autor: Dirk B. (devnull)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

mit folgenden Makros fülle ich eine Struktur mit den
Initialisierungswerten:
#if MENU_DEPTH == 0
#define MENU_INITIAL_STACK_DATA {}
#elif MENU_DEPTH == 1
#define MENU_INITIAL_STACK_DATA {0}
#elif MENU_DEPTH == 2
#define MENU_INITIAL_STACK_DATA {0,0}
#elif MENU_DEPTH == 3
#define MENU_INITIAL_STACK_DATA {0,0,0}
#elif MENU_DEPTH == 4
#define MENU_INITIAL_STACK_DATA {0,0,0,0}
#elif MENU_DEPTH == 5
#define MENU_INITIAL_STACK_DATA {0,0,0,0,0}
#elif MENU_DEPTH == 6
#define MENU_INITIAL_STACK_DATA {0,0,0,0,0,0}
#elif MENU_DEPTH == 7
#define MENU_INITIAL_STACK_DATA {0,0,0,0,0,0,0}
#elif MENU_DEPTH == 8
#define MENU_INITIAL_STACK_DATA {0,0,0,0,0,0,0,0}
#elif MENU_DEPTH == 9
#define MENU_INITIAL_STACK_DATA {0,0,0,0,0,0,0,0,0}
#endif

Hat jemand eine Idee, wie man so etwas skalierbar und
weniger redundant hin bekommt?

Klar, ich könnte ein Script nehmen, das mir eine Liste
generiert und die als Header einbinden. Aber das wäre
eher zweite Wahl.

Aber ja, ne, schon klar: Es geht eigendlich nur um
schöneren Code, sonst nix :-)

Ich freue mich auf Eure Antworten.

Schönen Gruß, Dirk

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie und wo benutzt du MENU_INITIAL_STACK_DATA?

Autor: Olaf Dreyer (Firma: O.D.I.S.) (dreyero)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MEMSET(3) 
Bibliotheksfunktionen 
MEMSET(3)



BEZEICHNUNG
       memset - fülle Speicher mit einer Bytekonstante

ÜBERSICHT
       #include <string.h>

       void *memset(void *s, int c, size_t n);

BESCHREIBUNG
       Die Funktion memset() schreibt n mal die Bytekonstante c in den 
Speicherbereich, auf den s zeigt.

RÜCKGABEWERT
       Die Routine memset() gibt einen Zeiger auf den Speicherbereich 
zurück, auf den s zeigt.

KONFORM ZU
       SVID 3, BSD 4.3, ISO 9899

SIEHE AUCH
       bzero(3), swab(3).




GNU                                                     14. Juni 1996 
MEMSET(3)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define MENU_INITIAL_STACK_DATA {0}

Das genügt.  Der Fall, dass ein Array 0 Elemente hat, ist ohnehin
syntaktisch nicht OK.  Alle anderen Fälle werden davon abgedeckt.

Das ganze braucht man natürlich nur für eine automatische Variable.
Hat die Variable `static storage' (also explizit 'static' deklariert
oder global), dann wird sie ohnehin by default mit 0 initialisiert.

Autor: Ex_RundS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe bei meinen Präprozessorkonfigurierbaren Arrays sows gemacht
uint8_t mein_arry [ELEMENT_ANZ] =
{
   0
#ifdef KANAL_2_AKTIV
 , 1
#endif
};

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die hässliche Schreibweise mit dem Komma vorn muss man übrigens
nicht benutzen.  Die fällt ja sowieso auf die Nase, wenn alle
möglichen Initialisierungselemente innerhalb von #if/#ifdef
stehen.  Der C-Standard gestattet prinzipiell ein Komma am Ende
einer Liste von Initialisierern, auch wenn danach kein weiteres
Element mehr folgt.  Damit geht sowas:
config_t config[] = {
#if CONFIG_THIS
  { 0, 1, 4 },
#endif
#if CONFIG_THAT
  { 1, 42, 0 },
#endif
};

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Der C-Standard gestattet prinzipiell ein Komma am Ende
> einer Liste von Initialisierern, auch wenn danach kein
> weiteres Element mehr folgt.

Unterscheidet sich das bei Enums? Da sind mir Compiler aufgefallen, die 
das nicht mögen. Alter Standard?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus t. Firefly schrieb:
>> Der C-Standard gestattet prinzipiell ein Komma am Ende
>> einer Liste von Initialisierern, auch wenn danach kein
>> weiteres Element mehr folgt.

> Unterscheidet sich das bei Enums?

Nein, ist dort genauso gestattet.

> Da sind mir Compiler aufgefallen, die
> das nicht mögen. Alter Standard?

Ja, vermutlich.  Mir ist so, als wäre das erst durch C99
abgesegnet.  Ich müsste mir allerdings extra einen ANSI-89/ISO-90-
Standard ansehen, um das mal zu vergleichen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.