Forum: Mikrocontroller und Digitale Elektronik Textersetzung innerhalb eines String


von Reiner W. (reiner_w)


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

von Stefan F. (Gast)


Lesenswert?

Benutze printf, damit kannst du Zahlen in Texte einbetten. Deine 
Variante mit den doppelten Defines ist allerdings effizienter.

512 passen übrigens nicht in 8bit rein.

von Yalu X. (yalu) (Moderator)


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) ">"));

von Reiner W. (reiner_w)


Lesenswert?

Der help-text geht mit Serial.print() über die Seriell und eigentlich 
nur fürs debugging gedacht, das wollte ich nicht noch verkomplizieren.

Aber Danke. Da werde ich erstmal bei den beiden #defines bleiben.

Stefanus F. schrieb:
> 512 passen übrigens nicht in 8bit rein.

Klar. wenn man ein Beispiel angibt, sollte das auch funktionieren;-) Im 
Original steht 255.

von Reiner W. (reiner_w)


Lesenswert?

Yalu X. schrieb:
> Das folgende STR-Makro (mit dem Hilfsmakro STR_) wandelt sein Argument
> in einen String um:

Danke. Sowas hab ich gesucht. Wenn da noch #defines dazukommen, ist das 
sicher einfacher.

von Nop (Gast)


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".

von Reiner W. (reiner_w)


Lesenswert?

Nop schrieb:
> Ja, mit dem stringify-Operator des Präprozessors. Etwa so:


Ja Danke. Siehe Antwort Yalu X.

von Nop (Gast)


Lesenswert?

Reiner W. schrieb:

> Ja Danke. Siehe Antwort Yalu X.

Jepp, das hat sich ungünstig überschnitten, da war er schneller. :-)

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.