mal wieder sprintf

Gast #2851093
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
#2851099
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.
#2851118
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren