mikrocontroller.net

Forum: Compiler & IDEs Präprozessor: Auswertung von Argumenten


Autor: Robert S. (razer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo an alle,

Ich habe eine Frage zum C Präprozessor. Ich möchte bei der Deklaration 
einer Struktur die Argumente auswerten. Die Struktur darf nur Deklariert 
werden, wenn die Argumente Gültig sind. (Der Wert zweier Argumente muss 
ungerade sein).
typedef struct foo
{
  uint8_t var1;
  uint8_t var2;  //muss bei der Deklaration ungerade sein
  uint8_t var3;  //muss bei der Deklaration ungerade sein
} sFoo;

sFoo s1 = {10, 7, 5};
sFoo s2 = {10, 8, 5};   //Diese Deklaration sollte ungültig sein und eine Fehlerausgabe erfolgen

Nur wie mache ich das mit dem Präprozessor??

Ich hoffe es kann mir wer helfen.
Danke im Voraus
Gruß Robert

Autor: Bernhard R. (barnyhh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gilt also
1. var2 = 2 * k2 + 1
2. var3 = 2 * k3 + 1

Klar?

Bernhard

Autor: Robert S. (razer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ne nicht wirklich.

Also Die Werte der Variablen ist egal. Nur müssen die zwei letzten Werte 
ungerade sein

Ich dachte mir das ewa so in der Art:

#define FOO(arg1, arg2, arg3)  \
#if(!(arg2 %2) || (!(arg3 % 2))\
#error Ungültige Deklaration   \  //Hier müsste der Struktur der Wert null übergeben werden
#else                          \
{arg1,arg2,arg3}               \
#endif                        

sFoo s = FOO(123, 20, 27);

Weiß jemand wie sowas in der Art geht?
Gruß Robert

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Nur wie mache ich das mit dem Präprozessor??

Elegant gar nicht.

Man könnte sich z.B. sowas basteln:
#define PAR1 10
#define PAR2 8
#define PAR3 4

#if ((PAR2/2)*2) == PAR2
#error "Parameter 2 ist nicht ungerade"
#endif

#if ((PAR3/2)*2) == PAR3
#error "Parameter 3 ist nicht ungerade"
#endif

sFoo s1 = {PAR1, PAR2, PAR3};

#undef PAR1
#undef PAR2
#undef PAR3

un das dann für alle Deklarationen wiederholen.
Aber schön ist anders.

Oliver

Autor: Bernhard R. (barnyhh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Präprozessor besorgt reine Textersetzung! Nicht mehr und nicht 
weniger.
Insbesondere sind in Präprozessor-Macros keine Präprozessor-Statements 
möglich.

Möglich ist allerdings folgendes (statt irgendwelchen Prüfungen im 
Macro):

#define FOO_INIT(p1,p2,p3) {p1, 2 * (p2) + 1, 2 * (p3) + 1)}

Ist es jetzt klar?

Bernhard

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.