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?
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?
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.
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.
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.
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.
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.