Sprintf - rozdíly mezi konverzí %i a %d? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Sprintf - rozdíly mezi konverzí %i a %d? – C / C++ – Fórum – Programujte.comSprintf - rozdíly mezi konverzí %i a %d? – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
13. 2. 2013   #1
-
0
-

Dobrý den,

u AtmelStudia 6.0 jsem se setkal s tímto problémem:

sprintf(head, "%02i%02i;", command, strlen(message));
   //výsledný řetězec ";" - chyba


sprintf(head, "%02d%02d;", command, strlen(message));
   //výsledný řetězec "0008;" - OK

Proč je rozdílné chování?

hu

Nahlásit jako SPAM
IP: 195.178.67.–
KIIV
~ Moderátor
+43
God of flame
13. 2. 2013   #2
-
0
-

%i asi nebude az tak standardni jako %d... a jelikoz u AVR znamena kazda zbytecnost vice obsazeneho mista ... zbytek si domyslim snadno :)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
blackman.ce0
Newbie
13. 2. 2013   #3
-
0
-

%i a %d se chová stejně při výstupu, např. printf(), ale při vstupu, např. scanf(), jsou už znát rozdíly. %d načte celé číslo v desítkové soustavě, naopak %i umožňuje šesnáctkovou(0x...) i osmičkovou(0...) soustavu.
Takže "033" bude 27 s %i ale 33 s %d.

Nahlásit jako SPAM
IP: 94.74.236.–
13. 2. 2013   #4
-
0
-

Je zvláštní, že u EW8051 od IAR Systems se to chová stejně. A je to na 8051 procesor. Nemělo by být problém aby překladač v obou případech generoval identický kód. Dost mne to zaskočilo, Atmel Studio je první překladač u kterého jsem se s tím setkal.

Pro čtení šestnáckových čísel je konverze %x.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
KIIV
~ Moderátor
+43
God of flame
13. 2. 2013   #5
-
0
-

jeste by to mohlo byt tou minimalni verzi.. (pokud to pouziva avr-gcc) - v ni se preskakuji urcite vsechny floaty coz sice %i neni, ale kdo vi jestli to taky neni vynechany z nejakeho duvodu

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
17. 2. 2013   #6
-
0
-

Už tomu vůbec nerozumím. TP Atmelu věc přezkoumali a tvrdí, že to funguje normálně. Zkusil jsem udělat jednoduchý příklad pod FreeRTOS abych jim demonstroval rozdílné chování a k mému překvapení to taky funguje správně. Asi začnu věřit, že se logické obvody někdy chovají nelogicky   

hu

Nahlásit jako SPAM
IP: 188.95.60.–
Řešení
28. 2. 2013   #7
-
0
-
Vyřešeno Nejlepší odpověď

Z vyjádření TP Atmelu:

Sprint() in printf-stdarg.c is called instead of the one defined in

string.h. If we look at the sprint() definition in printf-stdarg.c file %i
format is not handled. This may be the reason for unexpected behaviour of
sprint.

Nevšiml jsem si, že printf-stdarg.c redefinuje některé funkce. To se mi vymstilo.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 32 hostů

Podobná vlákna

Sprintf — založil oxidián

Pomoc s sprintf — založil jmeno

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý