Textersetzung innerhalb eines String

OP #5994854
Lesenswert?

Ich werkel nicht wirklich oft mit c und komme im Moment nicht weiter.
In meiner (Arduino) App gibt es eine PWM Ausgabe (speed). Die soll für 
AVR(8bit PWM) und STM32(16bit) gleichermaßen klappen, weshalb ich für 
die Validierung und den help-text der Eingabe #define verwende.
1
//AVR 512 STM32 1023
2
#define MAXSPEED 512

Neben der Validierung taucht das noch im help-text auf:
1
Serial.println(F("speed <motor (0[both], 1, 2)> <speed +/- 0..." MAXSPEED ">"));

Was nicht klappt, weil MAXSPEED ja ein Integer ist.

So geht es zwar:
1
#define MAXSPEED 255
2
#define MAXSPEED_S "255"
3
...
4
Serial.println(F("speed <motor (0[both], 1, 2)> <speed +/- 0..." MAXSPEED_S ">"));

Aber da muss ich natürlich die #defines jeweils als int/String haben.
Geht das irgendwie einfacher?

Gruß und schönen Sonntag
Moderator #5994899
Lesenswert?

Das folgende STR-Makro (mit dem Hilfsmakro STR_) wandelt sein Argument
in einen String um:

1
#define STR_(s) #s
2
#define STR(s) STR_(s)


Damit kannst du die println-Zeile wie folgt schreiben:

1
#define MAXSPEED 512
2

3
Serial.println(F("speed <motor (0[both], 1, 2)> <speed +/- 0..." STR(MAXSPEED) ">"));
Gast #5994909
Lesenswert?

Reiner W. schrieb:

> Aber da muss ich natürlich die #defines jeweils als int/String haben.
> Geht das irgendwie einfacher?

Ja, mit dem stringify-Operator des Präprozessors. Etwa so:
1
#define XSTRINGIFY(a) STRINGIFY(a)
2
#define STRINGIFY(a) #a
3

4

5
#define MAXSPEED 512
6
#define MAXSPEED_S XSTRINGIFY(MAXSPEED)

Die zwei Ebenen sind deshalb nötig, weil Du am Ende den String "512" 
haben willst und nicht den String "MAXSPEED".

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