Forum: Compiler & IDEs Makro zum Initialisieren von Werten in struct


von ruud86 (Gast)


Lesenswert?

Hallo hab mal ne Frage,

nur so zur persönlichen Weiterbildung

Beispiel:
1
#define red  ???
2
3
typedef struct RGB_struct
4
{
5
  uint8_t value_r;
6
  uint8_t value_g;
7
  uint8_t value_b;
8
} RGB_t;
9
10
int main(){
11
RGB_t RGB= red;  // RGB Werte für rot in struct

Wie müsste das define aussehen damit die Farbwerte für rot im struct RGB 
stehen?


Gruß

Adrian

von Marco M. (marco_m)


Lesenswert?

Je nach deiner Interpretation der Farbwerte z.B. so:

#define red  {255,0,0}

von ruud86 (Gast)


Lesenswert?

Hab ich schon probiert, beim umspeichern bekomme ich dann Probleme
1
RGB_t RGB={10, 50, 90};
2
RGB=red;

Fehlermeldung für die zweite Zeile:

> Error  1  expected expression before '{' token

Was mache ich in dem Fall falsch?

von Karl H. (kbuchegg)


Lesenswert?

ruud86 schrieb:
> Hab ich schon probiert, beim umspeichern bekomme ich dann Probleme
>
>
1
> RGB_t RGB={10, 50, 90};
2
> RGB=red;
3
>
>
> Fehlermeldung für die zweite Zeile:
>
>> Error  1  expected expression before '{' token
>
> Was mache ich in dem Fall falsch?

Logisch.
Makros sind ja keine Zauberstäbe.
Makros machen Textersetzung. Nicht mehr.

#define red  { 10, 50, 90 }

RGB_t RGB = red;


ist deswegen ok, weil die Syntax zur Initialisierung eines struct nun 
mal so aussieht
1
RGB_t RGB = { 10, 50, 90 };

Ob du jetzt den Klammerteil direkt hinschreibst, oder ob du den durch 
ein Text Suchen&Ersetzen vom Präprozesser einsetzen lässt, ist dem 
Compiler ja wurscht. Der kriegt nur das Endergebnis (die letzte Form) zu 
sehen und das ist syntaktisch korrekt.

Wohingehend die Zuweisung
1
  RGB = { 10, 50, 90 };

syntaktisch nicht korrekt ist. Und daran ändert sich auch nichts, wenn 
du den Klammerteil nicht direkt hinschreibst, sondern hinter einer 
Textersetzung in Form eines Makros versteckst.


Makros sind keine Wunderwuzzi. Sie machen nur Textersetzungen. Das was 
bei dieser Textersetzung herauskommt, muss syntaktisch korrekt sein. 
Daran ändert auch ein Makro nichts.

von ruud86 (Gast)


Lesenswert?

Ah stimmt danke, da war mal was...

Das kommt davon,wenn zu lange mit Labview arbeitet.

Gibt es eine Möglichkeit das Makro zu schreiben, dass ein umspeichern 
geht?

Danke schon Mal für die Nachhilfe ;)

Gruß

von Marco M. (marco_m)


Lesenswert?

ruud86 schrieb:
> Hab ich schon probiert, beim umspeichern bekomme ich dann Probleme
>
>
1
> RGB_t RGB={10, 50, 90};
2
> RGB=red;
3
>
>
> Fehlermeldung für die zweite Zeile:
>
>> Error  1  expected expression before '{' token
>
> Was mache ich in dem Fall falsch?

Initialisieren ist nicht zuweisen. RGB kann über ein Literal (das was in 
{..} steht) initialisiert werden, aber erst ab C99 gibt es die 
Möglichkeit, struct-Literale in Ausdrücken zu verwenden. Du kannst dann 
"RGB=(RGB_t)red;" schreiben, was  "RGB=(RGB_t){255,0,0};" entspricht. Du 
kannst dann übrigends auch "someFunction((RGB_t){255,255,0});" machen 
und so was.

Wenn dein Compiler es kann, dann definiere red so:
1
#define red  ((RGB_t){255,0,0})

GCC kann diese Schreibweise schon länger, kann also gut sein, dass es 
bei dir auch funktioniert.

von ruud86 (Gast)


Lesenswert?

super danke

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Marco M. schrieb:
> Wenn dein Compiler es kann, dann definiere red so:
>
> #define red  ((RGB_t){255,0,0})
>
>
> GCC kann diese Schreibweise schon länger,

So wie jeder andere C99-Compiler:

http://gcc.gnu.org/onlinedocs/gcc/Compound-Literals.html

Für Makronamen sollte man eher Großbuchstaben verwenden und für 
Variablen hingegen Kleinschreibung wählen.  Hat sich so eingebürgert und 
damit wird die Quelle besser verständlich.

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.