FULL-C: printf: Porovnání verzí

(Založena nová stránka s textem „ Tato stránka popisuje programovací jazyk '''FULL-C''', který je dostupný na vybraných zařízeních SDS. Některá zařízení používají SDS-C,…“)
 
Řádek 6: Řádek 6:
 
FULL-C plně sleduje standard jazyka C, i se všemi specifiky.
 
FULL-C plně sleduje standard jazyka C, i se všemi specifiky.
  
* Tisk a převody signed / unsigned
+
Viz příklady na konci stránky.
 
 
Na toto si dejte pozor, už to bylo zdrojem mnohých nečekaných problémů.
 
 
 
Nejčastější chybou je tisk číselné hodnoty proměnné definované jako char.
 
 
 
Typy "char", "int" jsou dle C standardu "signed char", "signed int" atd. (pokud jej explicitně nedefinujete jako unsigned).
 
 
 
To přináší "problém" při použití (s)(n)printf funkcí (atd.), kdy se použije %u nebo %x pro tisk číselné hodnoty (tedy ne např. %c), ale interně se to uvnitř (s)(n)printf převede na int32 a pak až tiskne. Lze si částečně pomoct pomocí %hu ale to nestačí. Řešením je přetypování.
 
 
 
Příklad:
 
<pre>
 
char c1, c2;
 
c1 = 10; c2 = 200;
 
printf("%u %u", c1, c2);
 
<pre>
 
Co by jste čekali že uvidíte ? Podle C standardu uvidíte toto: "10 -56" (bez uvozovek).
 
 
 
Správně totiž musíte program zapsat takto:
 
<pre>
 
char c1, c2;
 
c1 = 10; c2 = 200;
 
printf("%u %u", (unsigned char)c1, (unsigned char)c2);
 
<pre>
 
  
  
Řádek 119: Řádek 96:
  
 
Výpis do konzole (echo.html) je additivní, tzn. každé volání printf() tam text přidá (k textu, který tam už předtím byl). Pokud je potřeba obsah konzole smazat, použije se FULL-C funkce echoclear().
 
Výpis do konzole (echo.html) je additivní, tzn. každé volání printf() tam text přidá (k textu, který tam už předtím byl). Pokud je potřeba obsah konzole smazat, použije se FULL-C funkce echoclear().
 +
 +
 +
== Tisk a převody signed / unsigned ==
 +
 +
Na toto si dejte pozor, už to bylo zdrojem mnohých nečekaných problémů.
 +
 +
Nejčastější chybou je tisk číselné hodnoty proměnné definované jako char.
 +
 +
Typy "char", "int" jsou dle C standardu "signed char", "signed int" atd. (pokud jej explicitně nedefinujete jako unsigned).
 +
 +
To přináší "problém" při použití (s)(n)printf funkcí (atd.), kdy se použije %u nebo %x pro tisk číselné hodnoty (tedy ne např. %c), ale interně se to uvnitř (s)(n)printf převede na int32 a pak až tiskne. Lze si částečně pomoct pomocí %hu ale to nestačí. Řešením je přetypování.
 +
 +
Příklad:
 +
<pre>
 +
char c1, c2;
 +
c1 = 10; c2 = 200;
 +
printf("%u %u", c1, c2);
 +
</pre>
 +
Co by jste čekali že uvidíte ? Podle C standardu uvidíte toto: "10 -56" (bez uvozovek).
 +
 +
Správně totiž musíte program zapsat takto:
 +
<pre>
 +
char c1, c2;
 +
c1 = 10; c2 = 200;
 +
printf("%u %u", (unsigned char)c1, (unsigned char)c2);
 +
</pre>

Verze z 26. 6. 2021, 12:35

Tato stránka popisuje programovací jazyk FULL-C, který je dostupný na vybraných zařízeních SDS. 
Některá zařízení používají SDS-C, pro který máme návody jinde na této WiKi.

Standard

FULL-C plně sleduje standard jazyka C, i se všemi specifiky.

Viz příklady na konci stránky.


int printf(char *format, ...);

Provede vypsání parametrů (...) do konzole (echo.html) v závislosti na formátování (format).

Příklad:

 void main(void)
 {
   int i;

   i = 1 + 1;

   printf(" 1 + 1 = %d \n", i);

   for (;;); // wait here forever

 }

Příklad:

 void main(void)
 {
   char txt[6];

   txt[0] = 'h';
   txt[1] = 'e';
   txt[2] = 'l';
   txt[3] = 'l';
   txt[4] = 'o';
   txt[5] = 0;

   printf(" %s world \n", txt);

   for (;;);  // wait here forever

 }


Formátování

Platí, že všechny formátovací prvky jsou uvedeny pomocí znaku procenta '%' s následnou informací o typu parametru.

%specifier = popis

%%         = vypíše znak %
%d, %i     = signed decimal integer
%o         = unsigned octal
%u         = unsigned decimal integer
%x         = unsigned hexadecimal integer
%X         = unsigned hexadecimal integer (uppercase)
%e, %E     = nepodporováno
%g, %G     = nepodporováno
%a, %A     = nepodporováno
%f         = decimal floating point number
%F         = decimal floating point number (uppercase)
%c         = jeden znak
%s         = nulou ukončený text
%p         = pointer address
%n         = nepodporováno
%m         = nepodporováno

Samozřejmě, použití formátovacích prvků musí přesně odpovídat parametrům (...) poskytnutým příslušnému volání printf().

Formátování lze dále zpřesňovat - pomocí doplňujících parametrů v rámci každého formátovacího prvku:

%[flags][width][.precision][length]specifier 


Příklad:

 int i;
 unsigned int l, z;
 char *q;

 printf("%d %u %x %s \n", i, (unsigned int)l, (unsigned int)z, q);

 printf("Zarovnani nulami zleva na deset mist: %010d \n", 1984);


Souvislosti

Stejný způsob formátování používá i FULL-C funkce sprinf() a snprintf(), popř. sscanf().

Výpis do konzole (echo.html) je additivní, tzn. každé volání printf() tam text přidá (k textu, který tam už předtím byl). Pokud je potřeba obsah konzole smazat, použije se FULL-C funkce echoclear().


Tisk a převody signed / unsigned

Na toto si dejte pozor, už to bylo zdrojem mnohých nečekaných problémů.

Nejčastější chybou je tisk číselné hodnoty proměnné definované jako char.

Typy "char", "int" jsou dle C standardu "signed char", "signed int" atd. (pokud jej explicitně nedefinujete jako unsigned).

To přináší "problém" při použití (s)(n)printf funkcí (atd.), kdy se použije %u nebo %x pro tisk číselné hodnoty (tedy ne např. %c), ale interně se to uvnitř (s)(n)printf převede na int32 a pak až tiskne. Lze si částečně pomoct pomocí %hu ale to nestačí. Řešením je přetypování.

Příklad:

 char c1, c2;
 c1 = 10; c2 = 200;
 printf("%u %u", c1, c2);

Co by jste čekali že uvidíte ? Podle C standardu uvidíte toto: "10 -56" (bez uvozovek).

Správně totiž musíte program zapsat takto:

 char c1, c2;
 c1 = 10; c2 = 200;
 printf("%u %u", (unsigned char)c1, (unsigned char)c2);