Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

5. diel - Céčko a Linux - Code :: Blocks druhýkrát

V minulej lekcii, Céčko a Linux - Code :: Blocks , sme sa pozreli na nastavenie a možnosti Code :: Blocks a skúsili sme programátorskú klasiku - Hello world. Dnes si skúsime vytvoriť jednoduchý program a naučíme sa debuggovat. Na záver ešte pripojím pár tipov, ktoré by vám mohli spríjemniť prácu :)

Praktický príklad

Nebudeme nič komplikovať a napíšeme veľmi jednoduchý program, čo bude sčítavať dve hodnoty a vypíše nám výsledok. Zdrojový kód bude nasledujúce:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int a = 5;
   int b = 10
   int c;

   printf("Jednoduchá sčítačka\n");
   c = a + b;
   printf("Výsledek je %i", c);

   return 0;
}

Skúsme program preložiť a spustiť ... Čo sa stane? V programe máme jednu z najtypickejších chýb - chýbajúce bodkočiarku za príkazom. Kompilácia skončila neúspešne a v logu nájdeme vypísané dve chyby. Prvá je chýbajúce bodkočiarka, druhá nám hovorí, že premenná c nedeklarovaná. V skutočnosti je to ale iba jedna chyba - chýbajúce bodkočiarku za deklaráciou b spôsobil, že neprebehla deklarácia c. Riadok s chybou nám Code :: Blocks zvýraznil červeným štvorčekom. Ak klikneme na ďalšiu chybu (v logu), zvýrazní sa tá.

Chyba v Code :: Blocks - Linux a programovanie v jazyku C

Chybu si opravíme a znovu spustíme kompiláciu. Tentoraz už prebehne v poriadku. Keď potom spustíme program pomocou Run, výstup bude nasledujúci:

Spustenie programu v Code :: Blocks - Linux a programovanie v jazyku C

Ukázali sme si syntaktickú chybu. Čo ale keď ide o chybu sémantickú, teda chybu v algoritme? Naši sčítačka si trochu upravíme:

int main()
{
   int a, b, c;

   printf("Jednoduchá sčítačka\n");

   printf("Zadej číslo: ");
   scanf(" %i ", &a);

   printf("Zadej další číslo: ");
   scanf(" %i ", &a);

   c = a + b;
   printf("Výsledek je %i", c);

   return 0;
}

Program robí to rovnaké s tým rozdielom, že sčítanie čísla získame od užívateľa. Napísali sme si načítanie prvého čísla a pretože sme leniví, tak sme ho pre druhé číslo len skopírovali a upravili. Teraz to skúsime preložiť. Vidíme síce, že v logu je warning, ale ako "správne" programátorov nás zaujímajú len chyby. Varovanie môžeme bez problémov ignorovať. Hlavné predsa je, aby to nejako fungovalo. Preklad teda prebehol v poriadku a my môžeme náš upravený program vyskúšať.

chyba - Linux a programovanie v jazyku C

Naša prvá reakcia bude asi v štýle "Čo to je?!?". Dostali sme úplne nezmyselný výsledok a pritom ten kód vyzerá na pohľad dobre ... Uznávam, že v našom prípade sa dá chyba ľahko nájsť, ale predstavme si program násobne zložitejšie. To už tak jednoduché nie je. Keď teda narazíme na takú chybu, ako prvý sa pozrieme do logu, či sa nám prekladač náhodou nesnaží niečo oznámiť.

16 - warning: ‘b’ is used uninitialized in this function [-Wuninitialized]

Na riadku 16 používame neinicializované premennú b. Ale ako to? Pozrieme sa na spomínaný riadok. Nájdeme v ňom príkaz c = a + b. Z WARNING zistíme, že premennú b sme ešte v programe nepoužili. Ale veď do nej predsa načítame druhé číslo, nie? Aha ...

Debugging

Pokiaľ si Uľahčuje programovanie kopírovaním už napísaného kódu a jeho úpravou, iste sa vám podobná chyba už stala. V malom programe to ľahko nájdeme. Tú nám navyše pomôžu zapnuté direktívy -Wall a -Wextra. Vďaka nim sme boli upozornení na použitie neinicializované premenné. Ale čo keď bude program zložitejšie? Alebo čo keď budeme premennú b niekde v predchádzajúcej časti programu používať? To už by sme varovanie nedostali ... Čo v takom prípade robiť? Jednou možnosťou je stráviť hodiny študovaním kódu a hľadaním chyby. Presne to robí mnoho začínajúcich programátorov, ale je to dobré iba na získanie pocitu frustrácie. Existuje ďalší, oveľa lepšia možnosť - debugger (ladiace program, "odvšivovací").

Náš výpočet nám vracia niečo neočakávané. Nastavíme teda na riadok s výpočtom tzv. Breakpoint. Jednoducho povedané, breakpoint je miesto, v ktorom sa pri debuggovania zastaví realizácii programu. Breakpoint môžeme jednoducho pridať kliknutím na riadok (hneď vedľa čísla riadku) alebo pravým kliknutím a vybraním "Toggle breakpoint". Teraz spustíme program v debug móde (červená šípka Debug / Continue alebo F8). Zobrazí sa nám niečo také:

Breakpoint v Code :: Blocks - Linux a programovanie v jazyku C

V okne watches vidíme naše premenné a čo obsahujú (hodnoty sú pri spustení programu náhodné - typicky v nich je hodnota, ktorú tam nechala aplikácie, ktoré bola pamäť predtým priradená). Zadáme teda hodnoty ako normálne. Program normálne beží (nechá si zadať dve čísla) a zastaví sa na riadku s Breakpoint (pred jeho vykonaním).

debug - Linux a programovanie v jazyku C

Vidíme, že va máme 10 (aj keď by tam mala byť hodnota 5), vb niečo náhodného (malo by tam byť 10) avc taky nejaký nezmysel (to je v poriadku - do c sme ešte nič nezapisoval). Aby sa vykonal nasledujúci príkaz (c = a + b), klikneme na Next line alebo stlačíme F7. Vykonal sa výpočet a vidíme jasne, že správne - tu teda chyba nie je. Z hodnôt vstupných premenných ale vidíme, že pri ich načítanie nie je niečo v poriadku. Debugger ukončíme (červený krížik alebo Shift + F8) a pridáme hraničnými na riadky, kde načítame obe premenné.

Ďalší hraničnými - Linux a programovanie v jazyku C

Po spustení programu si všimneme, že sa zastavil už pred zadaním prvou premenné. Pomocou F7 budeme teda krokovať a sledovať, ako sa nám menia hodnoty premenných. Len poznámka - F7 musíme stlačiť, keď máme označené okno Code :: Blocks, nie keď sme v xterm.

debug druhýkrát - Linux a programovanie v jazyku C

Zadali sme 5 a do premennej a sa uložila 5. Tento príkaz je teda v poriadku. Všimnime si malé žlté sipecka vedľa nasledujúceho riadku - táto nám ukazuje, ktorý riadok sa po stlačení F7 vykoná ako ďalšie.

Debuggovania – Prvý krok - Linux a programovanie v jazyku C

Prebehlo zadanie druhej premennej. Zadali sme 10, vb by teda malo byť 10. Namiesto toho sa ale hodnota 10 objavila v premennej a. Už teda vieme, kde je problém a chybu môžeme opraviť.

krok 2 - Linux a programovanie v jazyku C

Tu je výsledný, funkčné kód:

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int a, b, c;

   printf("Jednoduchá sčítačka\n");

   printf("Zadej číslo: ");
   scanf(" %i ", &a);

   printf("Zadej další číslo: ");
   scanf(" %i ", &b);

   c = a + b;
   printf("Výsledek je %i", c);

   return 0;
}

Možno vám to teraz pripadá zbytočné a zložité. Ale vo väčších a komplikovanejších aplikácií sa obyčajne programátor bez debuggovania nezaobíde. Toto bol len taký úvod a základ a niekedy nabudúce sa na túto problematiku pozrieme hlbšie.

Pár tipov na záver

Ešte spomeniem pár užitočných maličkostí, čo by vám mohli uľahčiť život :)

Tip 1 - include súbory

Premýšľali ste niekedy, ako je napísaná nejaká knižničný funkcie, ale nevedeli, kde sa pozrieť? Alebo máte väčší projekt, ktorý má veľa hlavičkových súborov, ale nie je realizovaný v Code :: Blocks (a nechce sa vám ho vytvárať)? Jednoduché riešenie je kliknúť pravým tlačidlom na riadok s #include a "Open #include file" :)

open include - Linux a programovanie v jazyku C

Tip 2 - záložky

Ak editujete dlhší kód, môžu sa vám hodiť záložky - jednoducho označíte riadok (Ctrl + B alebo pravý klik Bookmarks-> Toggle bookmark). Medzi viac záložkami sa potom môžete pohybovať pomocou Alt + PgUp alebo PgDn.

Tip 3 - Poznámky a TODO

Komentovať, komentovať a komentovať. To je základ. Ak neveríte, uveríte, až budete pracovať na väčšom projektov a komentáre nebudú alebo ich bude málo ... ;)

Pri dlhých súborov s množstvom komentárov sa ale môžeme stretnúť s tým, že to nie je príliš prehľadné. Určitý sprehľadnenie môžeme dosiahnuť napríklad pomocou Todo listu (zoznam úloh). Novú položku môžeme pridať napríklad pravým kliknutím na riadok a "Add todo item". Zobrazí sa nám nasledujúce okno:

todo item - Linux a programovanie v jazyku C

Tu môžeme napísať samotný text úlohy, pridať používateľa, ktorý poznámku pridal (alebo pre ktorého je určená - záleží na dohode), nastaviť prioritu a prípadne aj zmeniť typ položky a jej zápis. Na výber sú TODO, FIXME a NOTE. Názvy myslím hovorí za seba .. :)

Ďalej máme na výber niekoľko druhov komentáre (rôzne nástroje pracujú s rôznym zápisom). Môžeme si tiež nechať pripísať dnešný dátum. Tiež nám nič nebráni napísať položku priamo a vyhnúť sa tak celému klikanie.

// TODO (david#1#3.3.2015): Úplně všechno

Zoznam všetkých takýchto položiek si môžeme zobraziť kliknutím na View-> Todo list. Objaví sa nám okno, ktoré si môžeme niekam pripnúť a kde môžeme rôzne filtrovať naše poznámky - či sa majú zobraziť len tie v aktuálne vybranom súbore, projektu alebo vo všetkých otvorených súboroch. Ďalej môžeme vyfiltrovať používateľa a typy. Ako môžeme vidieť, položky sa nám radí podľa priority (9 je najvyššia). Dvojklikom na položku sa presunieme priamo na miesto, kde sa nachádza.

todo list - Linux a programovanie v jazyku C

Užitočné, nie? Ešte by som spomenul, že môžeme tiež pridať poznámku priamo k projektu - Project-> Notes.

Tip 4 - "zakomentování" kódu

C nepovoľuje vnorené komentáre, takže k zakomentování "otravného" kúsku kódu, napríklad keď debuggujeme, nemôžeme použiť blokový komentár. Jedno riešenie je použiť podmienený preklad #if, ale to môže ísť na úkor prehľadnosti.

Code :: Blocks nám tohle veľmi uľahčuje - stačí označiť blok a stlačiť Ctrl + Alt + C (respektíve X pre odkomentování).

Drobnosti na záver

Kliknutím na premennú a stlačením Alt + N vyvoláte okno, kde môžete ľahko premenovať všetky jej výskyty.

Keď ste vedľa zátvorky a stlačíte Ctrl + Shift + B, skočíte na druhú zátvorku, ktorá k nej patrí. Pomocou Ctrl +, môžete prepínať otvorené súbory. Ctrl + Enter posunie kurzor na koniec riadku.

Tak, to bude pre dnešok asi všetko ... :) Budúci lekcie, Céčko a Linux - Filtre , bude o filtroch - aplikáciách, ktorých jediný vstup od užívateľa je pri ich spustení a ďalej už beží autonómne.


 

Predchádzajúci článok
Céčko a Linux - Code :: Blocks
Všetky články v sekcii
Linux a programovanie v jazyku C
Preskočiť článok
(neodporúčame)
Céčko a Linux - Filtre
Článok pre vás napísal David Novák
Avatar
Užívateľské hodnotenie:
1 hlasov
Autor se zajímá především o nízkoúrovňové programování (C/C++, ASM) a návrh hardwaru (VHDL).
Aktivity