Stránka 1 z 1

funkce sprintf

Napsal: 03 led 2016, 22:58
od Jirka525
Pokusil jsem se v Atmel Studiu naprogramovat MCU ATTiny 1634 a nedaří se mě rozpohybovat takový školní příklad:

volatile double teplota, napeti;
char tt2[100];
.
.
delka = sprintf(&tt2[0],"Napeti = %1.2f V Teplota = %2.1f C", napeti, teplota);

Samotná instrukce sprintf() neprotestuje, uloží řetězec do pole tt2, v proměnné délka je správný počet znaků řetězce. Místo desetinných čísel jsou tam ale ? (otazníky)
Do proměnných jsem zkoušel v debuggeru zapisovat různá čísla celá i desetinná ale vyloudit správný text se mě nepodařilo.
Nevíte někdo, kde je chyba?
Díky Jirka

Napsal: 03 led 2016, 23:36
od Zaky
co toto?

delka = sprintf(&tt2[0],%s%1.2f%s%2.1f%s,"Napeti = ",napeti," V Teplota = ",teplota," C");

ale asi to bude to samé.

zkusil bych případně nakrmit sprintf místo floatem integerem, kompilátor float nemusí umět, v prostředí, co používám pro jiné MCU, se musí kompilátoru a linkeru nastavit parametry, aby sprintf uměl float a pak je výsledný kód podstatně větší. Pro menší velikost výsledného kódu jsem si musel desetinné číslo sestavit ze dvou integerů sám.

Napsal: 03 led 2016, 23:39
od Zaky
pogoogli, najdeš řešení, je toho dost, třeba http://www.avrfreaks.net/forum/floats-and-sprintf

Napsal: 05 led 2016, 00:23
od Jirka525
Zaky mnohokrát děkuji. Měl jsi pravdu. Bylo potřeba správně nastavit linker option a knihovny pro linker. Jenonomže hledat tyto informace v dokumentaci pro atmel studio je opravdu pro vytrvalé. V poločase hledání jsem chtěl program přepsat abych se vyhnul funkci sprintf(). Naštěstí zvědavost mi nedala, takže se mě podařilo dojít do cíle.