Skip to content
 

Hranatý kolík do okrúhlej dierky

Poznáte ten psychiatrický test, kde človek musí strkať rôzne tvarované kolíky do rôznych dierok?

Určite áno. A určite viete, ako to dopadne s človekom ktorý strká hranatý kolík do okrúhlej dierky, prípadne veľký kolík do malého otvoru. Väčšinou si vyslúži dlhší pobyt v zariadení pre takýchto ľudí určenom. A argumenty, že ten test je blbý a kolíky by mali byť gumené sú ocenené maximálne útrpným úsmevom.

Ale v programovaní je to tak trochu inak. V tejto profesii sa strkanie hranatých kolíkov do okrúhlych dierok považuje za normálne a tolerované. K tomu sa dá prirovnať priraďovanie signed a unsigned hodnôt. A priraďovanie 32 bitových hodnôt do 16 bitových premenných sa dá prirovnať strkaniu veľkého kolíka do malej dierky.

Pozrime sa na jeden malý úryvok kódu. Tento kód sa objavil v diskuzii na mikrozone. (prosím pôvodného autora kódu aby ďalšie slová nebral príliš osobne – nech sa poďakuje dalšiemu diskutujúcemu zmieňujúcemu „sviňu Ritchieho“, vďaka ktorému sa zrodila táto úvaha)

1.      #include <stdio.h>    //
2.
3.      #define DELTA_DA_MINUS 20     //
4.
5.
6.      int main(void)
7.      {
8.      volatile static uint16_t hodnota_da = 10;
9.      static uint32_t kalibracia;
10.              while(1)  {
11.                      if (hodnota_da >= DELTA_DA_MINUS) hodnota_da -= DELTA_DA_MINUS;
12.                      kalibracia = 1000 * 226;
13.                      kalibracia = kalibracia*(uint32_t)hodnota_da;
14.                      kalibracia = kalibracia/1000;
15.                      if (kalibracia > 255) kalibracia = 255;
16.                      hodnota_da = (uint8_t)kalibracia;
17.              }
18.      }

Aké sú tam formálne chyby a (potenciálne) problémy?

  • Riadok 8 – priradenie int do unsigned int
  • Riadok 11 – porovnanie int a unsigned int
  • Riadok 12 – 16-bitový výpočet vedúci k 32 bitovému výsledku
  • Riadok 15 – porovnanie int a unsigned int, navyše 32-bitovej hodnoty so 16-bitovou, plus ich následné priradenie
  • Riadok 16 – tak toto je úplná záhada – 32 bitová hodnota, precastovaná na 8 bitov a priradená do 16-bitovej premennej

Ak vynecháme tajomný riadok 16, tak tu máme šesť formálnych chýb (vrátane unikátu 3 chyby v jedinom riadku 15) – inými slovami, šesť hranatých kolíkov zatlčených do okrúhlych dierok, resp. veľkých kolíkov zatlčených do malých dierok.

Smutné je, že v ďalšej diskuzii nikto ani slovom nenaznačil tieto problémy. Skôr sa diskuzia ubrala tým smerom – ako to býva obvyklé – aké je to C a jeho autori zlé.

Asi sa treba zmieriť s tým, že programátorská profesia sa stáva stále viac útočiskom pre ľudí pre ktorých je zatĺkanie veľkých hranatých kolíkov do malých okrúhlych dierok niečím normálnym.

Je mi z toho smutno.

Print Friendly, PDF & Email
18 678 zobrazení