Forum: Compiler & IDEs Konstante in Stringkonstante einfügen?


von Paul H. (powl)


Lesenswert?

Hi!

Ich habe eine Konstante die ich mit #define Temperatur 180 definiere. 
Nun möche ich den eingestellten Wert über UART senden. Kann ich die 
Konstante irgendwie in die zu sendende Stringkonstante einfügen?
1
  rs232_send("Blabla ganz normaler Text");
2
  rs232_send("Temperatur: "+Temperatur+"°C");

so zum Beispiel (leider funktioniert das so halt nicht).

lg PoWl

von manuel (Gast)


Lesenswert?

sprintf(c, "Temperatur: %u C", Temperatur);
rs232_send(c);

von Paul H. (powl)


Lesenswert?

Danke!

bei sprintf meckert er rum, das kennt er nicht. muss ich vorher noch was 
includen?

lg PoWl

von Stefan E. (sternst)


Lesenswert?

stdio.h

von Paul H. (powl)


Lesenswert?

Danke #2;
1
  char con;
2
  sprintf(con, "Temperatur: %u °C", Temperatur);
3
  rs232_send(con);

so hab ich das nun. Ich bekomme allerdings immernoch Warnings und das 
Programm scheint sich in eine Endlosschleife zu verfangen und sendet nur 
Müll.

../Laminatorsteuerung.c:67: warning: passing argument 1 of 'sprintf' 
makes pointer from integer without a cast

../Laminatorsteuerung.c:68: warning: passing argument 1 of 'rs232_send' 
makes pointer from integer without a cast

Was heißt denn makes pointer from integer. Macht einen Zeiger aus einem 
Integer?

../Laminatorsteuerung.c:67: warning: 'con' is used uninitialized in this 
function

Das dürfte ja nicht weiter stören.

lg PoWl

von Stefan E. (sternst)


Lesenswert?

con muss natürlich groß genug sein, um den ganzen String aufnehmen zu 
können:
char con[20];

von Michael U. (amiga)


Lesenswert?

Hallo,

char con defniert con als char, also 1 Byte.

Wie willst Du da den String "Temperatur: %u °C" drin unterbringen?

sprintf erwartet wohl einen Zeiger auf den String bzw. das char-Array 
als ersten Parameter.

rs232send(con) soll was senden? Ein Byte? Den String?

PS: immernoch beim ASM programmieren und bei etwas C üben, also bitte 
die Kommentare der anderen beachten...

Gruß aus Berlin
Michael

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

1
#define STRINGIZE(s) #s
2
#define S(s) STRINGIZE(s)
3
4
#define Temperatur 180
5
6
...
7
  rs232_send("Temperatur: " S(Temperatur) " °C");

von Paul H. (powl)


Lesenswert?

Ja, Michael, hast recht das war ein Denkfehler von mir..

@ Jörg, das probier ich auch gleich.


//Edit: funktioniert prima, danke! :-)

von Thomas W. (thomas_v2)


Lesenswert?

Wie bekomme ich denn dieses übersetzt:
1
#define HERE "Entering " __PRETTY_FUNCTION__ "()"
2
printf(HERE);
printf() soll durch jede andere Funktion die einen String ausgibt 
ersetzt werden können.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Thomas W. wrote:

> Wie bekomme ich denn dieses übersetzt:

Geht nicht (mehr).  _FUNCTION__ und __PRETTY_FUNCTION_ werden
mittlerweile wie das C99-Konstrukt _func_ behandelt, und sind
damit ein initialisiertes const char[] Objekt anstatt eines
Stringliterals.

von Thomas W. (thomas_v2)


Lesenswert?

Das ist ja unschön. Das hieße ja, dass ich immer eine lokale Variable 
anlegen muss im diesen Text zu speichern.
Lässt sich da mit etwas Makrologie noch was machen?

von Luther B. (luther-blissett)


Lesenswert?

Thomas W. wrote:
> Wie bekomme ich denn dieses übersetzt:
>
1
> #define HERE "Entering " __PRETTY_FUNCTION__ "()"
2
> printf(HERE);
3
>
> printf() soll durch jede andere Funktion die einen String ausgibt
> ersetzt werden können.

Seit gcc 3.4 ist _PRETTY_FUNCTION_ kein string literal mehr sondern 
expandiert zu einer Variable, darum geht das mit der string 
Konkatenation nicht. Du brauchst so etwas wie das hier:
1
const char *my_here(const char *h) 
2
{
3
 static char buf[40];
4
 snprintf(buf,sizeof(buf),"Entering %s()\n",h);
5
 return buf; 
6
}
7
8
#define HERE my_here(__PRETTY_FUNCTION__)
oder
1
#define PRINT_HERE printf("Entering %s()\n",__PRETTY_FUNCTION__);

von Luther B. (luther-blissett)


Lesenswert?

Du kannst natürlich auch schauen, ob der alloca Trick functioniert:
1
const char *fmt_here(char *buf, size_t l, const char *h)
2
{
3
 snprintf(buf,l,"Entering %s()\n",h);
4
 return buf; 
5
}
6
7
#define HERE fmt_here(alloca(strlen(__PRETTY_FUNCTION__)+15),strlen(__PRETTY_FUNCTION__)+15,__PRETTY_FUNCTION)

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.