mikrocontroller.net

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


Autor: Paul H. (powl)
Datum:

Bewertung
0 lesenswert
nicht 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?
  rs232_send("Blabla ganz normaler Text");
  rs232_send("Temperatur: "+Temperatur+"°C");

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

lg PoWl

Autor: manuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sprintf(c, "Temperatur: %u C", Temperatur);
rs232_send(c);

Autor: Paul H. (powl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!

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

lg PoWl

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stdio.h

Autor: Paul H. (powl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke #2;
  char con;
  sprintf(con, "Temperatur: %u °C", Temperatur);
  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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define STRINGIZE(s) #s
#define S(s) STRINGIZE(s)

#define Temperatur 180

...
  rs232_send("Temperatur: " S(Temperatur) " °C");

Autor: Paul H. (powl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, Michael, hast recht das war ein Denkfehler von mir..

@ Jörg, das probier ich auch gleich.


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

Autor: Thomas W. (thomas_v2)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas W. (thomas_v2)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Luther Blissett (luther-blissett)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas W. wrote:
> Wie bekomme ich denn dieses übersetzt:
>
> #define HERE "Entering " __PRETTY_FUNCTION__ "()"
> printf(HERE);
> 
> 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:
const char *my_here(const char *h) 
{
 static char buf[40];
 snprintf(buf,sizeof(buf),"Entering %s()\n",h);
 return buf; 
}

#define HERE my_here(__PRETTY_FUNCTION__)
oder
#define PRINT_HERE printf("Entering %s()\n",__PRETTY_FUNCTION__);

Autor: Luther Blissett (luther-blissett)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst natürlich auch schauen, ob der alloca Trick functioniert:
const char *fmt_here(char *buf, size_t l, const char *h)
{
 snprintf(buf,l,"Entering %s()\n",h);
 return buf; 
}

#define HERE fmt_here(alloca(strlen(__PRETTY_FUNCTION__)+15),strlen(__PRETTY_FUNCTION__)+15,__PRETTY_FUNCTION)


Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.