Makro zum Initialisieren von Werten in struct

Gast #3014048
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
Gast #3014087
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?
#3014106
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.
Gast #3014121
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ß
#3014124
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.
Persönliche Seite #3016674
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren