Float till C string - sprintf fungerar inte i STM32

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

Float till C string - sprintf fungerar inte i STM32

Inlägg av DanielM »

Jag tänkte göra om float till en C-sträng för att skriva ut på en LCD hos en STM32.

Denna kod genererar bara null, dvs ASCII 0.

Kod: Markera allt

float var = 10.0;
char buffer[10];
memset(buffer, 0, 10*sizeof(char));
sprintf(buffer, "%f", var);
Buffer är alltså fylld 0.

Så har jag glömt något ?

Denna fungerar inte heller

Kod: Markera allt

char buffer[10];
memset(buffer, 0, 10*sizeof(char));
sprintf(buffer, "%f", 10.0);
Men detta fungerar.

Kod: Markera allt

char buffer[10] = "10.0";
Zkronk
Inlägg: 1423
Blev medlem: 23 augusti 2005, 16:44:36
Ort: Uppsala

Re: Float till C string - sprintf fungerar inte i STM32

Inlägg av Zkronk »

Till 8-bitars AVR:er är %f bortrationaliserat då det tydligen är väldigt komplicerat att skriva ut decimaltal, och koden för detta tar upp för mycket programminne.
Men det ska gå att slå på stödet med en kompilatorflagga om man vill göra detta ändå.

Jag misstänker att det kanske är samma "problem" på STM32?
XorXaX
Inlägg: 409
Blev medlem: 27 maj 2004, 09:44:16

Re: Float till C string - sprintf fungerar inte i STM32

Inlägg av XorXaX »

Efter lite googlande verkar det vara som Zkronk säger.

Hittade denna implementationen under sökandet:
https://github.com/mpaland/printf
Den borde du kunna använda.

.
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

Re: Float till C string - sprintf fungerar inte i STM32

Inlägg av DanielM »

Zkronk skrev:Till 8-bitars AVR:er är %f bortrationaliserat då det tydligen är väldigt komplicerat att skriva ut decimaltal, och koden för detta tar upp för mycket programminne.
Men det ska gå att slå på stödet med en kompilatorflagga om man vill göra detta ändå.

Jag misstänker att det kanske är samma "problem" på STM32?
Men det går väll ändå att använda float på en AVR 8 bit trots att %f inte fungerar?
Gimbal
Inlägg: 7918
Blev medlem: 20 april 2005, 15:43:53

Re: Float till C string - sprintf fungerar inte i STM32

Inlägg av Gimbal »

Ja float fungerar fint för övrigt.
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

Re: Float till C string - sprintf fungerar inte i STM32

Inlägg av DanielM »

XorXaX skrev:Efter lite googlande verkar det vara som Zkronk säger.

Hittade denna implementationen under sökandet:
https://github.com/mpaland/printf
Den borde du kunna använda.

.
Kan man inte göra om 4 bytes till float?
Den första bitten är ju om det är negativt eller positivt? De övriga bittvärden är väll storleken?
Användarvisningsbild
Icecap
Inlägg: 26136
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Float till C string - sprintf fungerar inte i STM32

Inlägg av Icecap »

Lite off-topic:
float var = 10.0;
char buffer[10];
memset(buffer, 0, 10*sizeof(char));
sprintf(buffer, "%f", var);

memset(buffer, 0, 10*sizeof(char)); // Denna rad är ganska knasig och en potentiell felkälla! Bör vara:
memset(buffer, 0, sizeof(buffer)); // Denna rad är mycket mer rätt

Skillnaden är att OM du ändrar storleken på buffer[] MÅSTE du i originalraden ändra antalet. I "min" rad sker detta automatisk vid kompileringen.
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Re: Float till C string - sprintf fungerar inte i STM32

Inlägg av arvidb »

Och ännu hellre:

Kod: Markera allt

float var = 10.0;
char buffer[10];
snprintf(buffer, sizeof(buffer), "%f", var);
memset() av buffer är väl onödig, snprintf() skriver ju ändå över innehållet sedan och avslutar med '\0'.
XorXaX
Inlägg: 409
Blev medlem: 27 maj 2004, 09:44:16

Re: Float till C string - sprintf fungerar inte i STM32

Inlägg av XorXaX »

DanielM skrev: Kan man inte göra om 4 bytes till float?
Den första bitten är ju om det är negativt eller positivt? De övriga bittvärden är väll storleken?
Nja. Kolla upp hur float lagras. Det är delar i en float om jag minns rätt. Signifikad, bas och exponent.

1.2345 t.ex. lagras som 12345 * 10^(-4).

.
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

Re: Float till C string - sprintf fungerar inte i STM32

Inlägg av DanielM »

Icecap skrev:Lite off-topic:
float var = 10.0;
char buffer[10];
memset(buffer, 0, 10*sizeof(char));
sprintf(buffer, "%f", var);

memset(buffer, 0, 10*sizeof(char)); // Denna rad är ganska knasig och en potentiell felkälla! Bör vara:
memset(buffer, 0, sizeof(buffer)); // Denna rad är mycket mer rätt

Skillnaden är att OM du ändrar storleken på buffer[] MÅSTE du i originalraden ändra antalet. I "min" rad sker detta automatisk vid kompileringen.
Orsaken varför jag brukar ange storleken manuellt har med att man kan ej kolla storlek på pekar arrayer. En vana för mig.
arvidb skrev:Och ännu hellre:

Kod: Markera allt

float var = 10.0;
char buffer[10];
snprintf(buffer, sizeof(buffer), "%f", var);
memset() av buffer är väl onödig, snprintf() skriver ju ändå över innehållet sedan och avslutar med '\0'.
Resulterar exakt samma. Jag får ut inget.
Findecanor
Inlägg: 982
Blev medlem: 2 juli 2010, 23:04:07

Re: Float till C string - sprintf fungerar inte i STM32

Inlägg av Findecanor »

Kolla också dokumentationen för vad snprintf på din plattform förväntar sig för typ till "%f" och se till att det verkligen är den typen som du skickar in.
Variabla parametrar i C är inte typ-checkade, så man måste kolla sånt manuellt.
På desktop-system är typen som motsvarar"%f" ofta inte float utan double.
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

Re: Float till C string - sprintf fungerar inte i STM32

Inlägg av DanielM »

Som jag hittar så är %f både för float och double.

http://c-faq.com/stdio/scanfvsprintf.html

Däremot så fungerar %d med sprintf :)

Testade med float och v3 = 10 på min LCD. Så float fungerar!

Kod: Markera allt

      char buffer[10];
		float v1 = 5.1;
		float v2 = 5.4;
		int v3 = (int) (v1 + v2);
		memset(buffer, 0, 10*sizeof(char));
		sprintf(buffer, "%d", v3);
		setCursor(&lcd0, 5, 0);
		printToLCD(&lcd0, buffer, 10);
hummel
Inlägg: 2267
Blev medlem: 28 november 2009, 10:40:52
Ort: Stockholm

Re: Float till C string - sprintf fungerar inte i STM32

Inlägg av hummel »

För exakt vilken tool chain gäller din länk http://c-faq.com/stdio/scanfvsprintf.html?
Vad säger dokumentationen till din tool chain?
Användarvisningsbild
Icecap
Inlägg: 26136
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Float till C string - sprintf fungerar inte i STM32

Inlägg av Icecap »

I ditt exempel är buffer[] inte en länkad array.

Men är det så ska man köra en:
#define buffer_size 10
char buffer[buffer_size];
och senare:
memset(buffer, 0, buffer_size * sizeof(char));

På det vis följer de alltid varandra. Ditt sätt med manuella data KOMMER på något tidpunkt att ställa till det ganska ordentligt och än mer svårbuggad.

Och det är sant att det inte behövs. Vill du starta med ett känd läge duger:
buffer[0] = 0;
alldeles fint.
Mr Andersson
Inlägg: 1397
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Float till C string - sprintf fungerar inte i STM32

Inlägg av Mr Andersson »

hummel skrev:För exakt vilken tool chain gäller din länk http://c-faq.com/stdio/scanfvsprintf.html?
Det gäller exakt alla C-kompilatorer.
(Om kompilatorn inte följer standarden är det ingen C-kompilator, utan bara C-liknande)
Skriv svar