Forum: Mikrocontroller und Digitale Elektronik mal wieder sprintf


von Tom (Gast)


Lesenswert?

und täglich grüßt das Murmeltier ;)

Also folgendes Problem tritt bei mir auf, ich lese Werte über den 
CAN-Bus ein und berechne diese dann auch, diesen float möchte ich gerne 
über sprintf ausgeben, die Zahlen stimmen auch jedoch wird hinter den 
Zahlen immer ein Buchstabe gehängt, bei dem ich nicht weiß woher 
erkommt:
1
char  ch_CAN_Daten_Byte[2];
2
sprintf(ch_CAN_Daten_Byte, "%3.1f", Zahl);
3
DRAW_SMALL_TEXT(110,5, ch_CAN_Daten_Byte);

Drehzahl ist ein float und wird aus zwei 16bit Werten berechnet.

Bsp. Bei einer zahl von 100 wird 100h angezeigt. Bei einer zahl von -100 
wird -100z angezeigt.


Vllt kennt jemand das Problem und kann mir helfen

von Karl H. (kbuchegg)


Lesenswert?

"%3.1f

ist zu wenig für -100

die 3 sind die Gesamtzahl aller Stellen! Inklusive einem Vorzeichen. 
Inklusive dem Dezimalpunkt. Inklusive den Nachkommastellen. Alleine das 
sind daher bei -100 schon 4 Stellen, und da hast du noch gar kein Komma 
und nichts nach dem Komma.

char  ch_CAN_Daten_Byte[2];

Wie soll ein String ("100") der aus (mit dem \0 Byte am Ende) 4 Zeichen 
besteht in ein Array der Größe 2 passen?

Und immer darauf aufpassen! sprintf DARF auch mehr Zeichen erzeugen als 
im Formatstring angegeben ist. Nämlich dann, wenn die Formatangabe zu 
kurz ist. %3.1 passt nicht für -100. Daher erweitert sprintf automatisch 
auf 4 Zeichen.

von Stefan++ (Gast)


Lesenswert?

Tom schrieb:
> char  ch_CAN_Daten_Byte[2];
> sprintf(ch_CAN_Daten_Byte, "%3.1f", Zahl);
> DRAW_SMALL_TEXT(110,5, ch_CAN_Daten_Byte);

Ist ch_CAN_Daten_Byte mit 2 Byte nicht ein bisschen zu kurz für "%3.1f" 
???

von Erich (Gast)


Lesenswert?


von Alexander D. (abadu)


Lesenswert?

Du hast das Feld
1
char  ch_CAN_Daten_Byte[2];

mit zuwenig Platz dimensioniert, denn darin müssen nicht nur die 
aufbereitete Zahl, sondern auch das Endezeichen für den C-String Platz 
finden. Damit so etwas nicht passiert, sollte man sprint_f anstatt 
sprintf nehmen. Wieviel Platz verbraucht wird, zeigt einem der 
Rückgabewert von sprintf an:
1
len = sprintf(ch_CAN_Daten_Byte, "%3.1f", Zahl);

Gruß
Alexander

von Klaus W. (mfgkw)


Lesenswert?

Alexander D. schrieb:
> Damit so etwas nicht passiert, sollte man sprint_f anstatt
> sprintf

Vielleicht snprintf() ??

von Alexander D. (abadu)


Lesenswert?

Du hast recht, man muss natürlich snprintf() nehmen

Gruß
Alexander

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.