funkce sprintf

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
Jirka525
Příspěvky: 325
Registrován: 22 kvě 2013, 00:00
Bydliště: Psáry JN79GW

funkce sprintf

#1 Příspěvek 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
Jirka
Uživatelský avatar
Zaky
Příspěvky: 7050
Registrován: 30 říj 2010, 00:00
Bydliště: Praha

#2 Příspěvek 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.
Naposledy upravil(a) Zaky dne 03 led 2016, 23:39, celkem upraveno 1 x.
Uživatelský avatar
Zaky
Příspěvky: 7050
Registrován: 30 říj 2010, 00:00
Bydliště: Praha

#3 Příspěvek od Zaky »

pogoogli, najdeš řešení, je toho dost, třeba http://www.avrfreaks.net/forum/floats-and-sprintf
Uživatelský avatar
Jirka525
Příspěvky: 325
Registrován: 22 kvě 2013, 00:00
Bydliště: Psáry JN79GW

#4 Příspěvek 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.
Jirka
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“