Textersetzung innerhalb eines String

OP #5994854
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
Gast #5994856
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.
Moderator #5994899
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) ">"));
OP #5994900
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.
Gast #5994909
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

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.