Sida 1 av 2

Float till C string - sprintf fungerar inte i STM32

Postat: 16 november 2019, 12:41:39
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";

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

Postat: 16 november 2019, 12:58:33
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?

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

Postat: 16 november 2019, 13:21:35
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.

.

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

Postat: 16 november 2019, 14:08:40
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?

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

Postat: 16 november 2019, 14:13:39
av Gimbal
Ja float fungerar fint för övrigt.

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

Postat: 16 november 2019, 15:19:05
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?

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

Postat: 16 november 2019, 15:59:25
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.

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

Postat: 16 november 2019, 16:09:36
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'.

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

Postat: 16 november 2019, 17:04:51
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).

.

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

Postat: 16 november 2019, 20:06:50
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.

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

Postat: 16 november 2019, 20:26:06
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.

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

Postat: 16 november 2019, 20:48:10
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);

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

Postat: 16 november 2019, 20:57:19
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?

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

Postat: 16 november 2019, 21:37:03
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.

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

Postat: 16 november 2019, 21:43:00
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)