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

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.

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.