==Programy a chyby==
Téměř každý program má svoje chyby. Chyby mohou být jak v návrhu(program tak jak je naržen nefunguje správně),
tak v realizaci (chyby v kódu). Praktičtější je ovšem chyby rozdělit na chyby "aktivní" a pasivní. Do první
skupiny patří chyby patrné na první pohled, tj. program nedělá to co má, nebo padá. Do druhé skupiny patří typicky
chyby v alokaci a uvolňování paměti. Druhou skupinu je výrazně obtížnější jak detekovat, tak odhalit.
===Fáze ladění kódu===
Vytváření a aldění nového software vpostatě probíhá podle následujícího shématu:
DOPSAL JSEM SOFTWARE
TESTUJU HO
if (V PROGRAMU JE CHYBA) goto ZACATEK LADENI else goto KONEC
ZACATEK LADENI
STABILIZUJ CHYBU //zajisteni aby se chyba opakovala
LOKALIZUJ CHYBU //nalezeni příslušné knihovny, funkce, řádku, kde k chybam dochazi
OPRAV CHYBU
goto TESTUJ HO
KONEC //program je odladěný a můžeme začít s distribucí.
===Možnosti ladění kódu===
====Expertní čtení====
Nejjednosušší je tzv "expertní čtení", aneb "Strécu, ono to nefacha, tak se do toho hleď ještě mrknout.". Tohle je jistě
možnost, ale má nevýhodu zejména psychologickou, pokud jsme udělali logickou chybu v návrhu, je poměrně těžké ji
odstranit jen čtením kódu, protože se ném kód zdá v pořádku. Je to (prý) poměrně funkční v případě, že kód po nás čte
někdo jiný.
====Ladící výpisy====
Asi nejobecnější možnost ladění, funguje skoro vždy a skoro všude. Je dobré vypisovat na stderr, pač jinak pokud
něco vypíšete na stdin a program pak "spadne", hláška se může v principu stratit (neměla by, ale experimentálně je
tohle tvrzení ověřené).
Do programu je možné zařadit výpisy na místa, kde čekáme, že by mohlo dojít k chybě.
Docela rozumné může být využít makroprocesoru překladače, napřiklad konstrukcí
#ifdef DEBUG
printf ("hodnota x je : %d\n", x);
#endif
a makro DEBUG si definovat třeba při překladu
$ cc -o sorter -DDEBUG main.c
A jinak v jazyce c/c++ jsou k dispozici makra
{| border=1 cellspacing=0 cellpadding=5
| __LINE__
| Číslo aktuální řádky
|-
| __FILE__
| Jméno souboru
|-
| __DATE__
| datum, Řetězec formátu "Mmm dd yyyy"
|-
| __TIME__
| čas, Řetězec formátu "h h : mm : s s"
|-
|}
====Ladící nástroje====
Jsou asi neúčinnější formou ladění, (pokud jsou dostupné), pod unixovými systémy je obvykle k dspozici pro ladění
chyb, které se projevují db, který má pod linuxem obdobu gdb. Na skryté chyby, např v alokaci paměti jsou k dispozici
nástroje typu mtrace, nebo knihovna electric fence (možná pár slov na konci).
Program gdb nám umožňuje pozorovat co se děje v "programu vevnitř", popřípadě toto dokonce měnit.
==Ukázkový příklad 1.==
main.c
#include <stdio.h>
#include <stdlib.h>
#include "qsort.h"
int main(int argc, char ** argv){
int i;
int cisla[] = {10, 12, 2, 4, 8,7, 1, 20, 3, 25};
int * cilsa;
int arrsize = sizeof(cisla) / sizeof(int);
printf("\n\nhello, Im Program for sorting.. ");
printf("\nthis is my input :");
for (i=0; i < arrsize; i++){
printf("%d ",cisla[i] );
}
//tady se to celý děje.
xquickSort(cilsa, arrsize);
printf("\nthis is my output :");
for (i=0; i < arrsize; i++){
printf("%d ",cisla[i] );
}
printf("\nDo you think it's OK?\n");
return 0;
}
qsort.c
void xq_sort(int numbers[], int left, int right){
int pivot, l_hold, r_hold;
l_hold = left;
r_hold = right;
pivot = numbers[left];
while (left < right)
{
while ((numbers[right] >= pivot) && (left < right))
right--;
if (left != right)
{
numbers[left] = numbers[right];
left++;
}
while ((numbers[left] <= pivot) && (left < right))
left++;
if (left != right)
{
numbers[right] = numbers[left];
right--;
}
}
numbers[left] = pivot;
pivot = left;
left = l_hold;
right = r_hold;
if (left < pivot)
xq_sort(numbers, left, pivot-1);
if (right > pivot)
xq_sort(numbers, pivot+1, right);
}
qsort.h
extern void xquickSort(int numbers[], int array_size);
Makefile
EXECUTABLE = sorter
SOURCES = main.c qsort.c
HEADERS = qsort.h
OBJECTS = $(SOURCES:.c=.o)
CC = gcc
CFLAGS = -ggdb -Wall
LDFLAGS = -o
all: $(EXECUTABLE)
clean:
rm *.o $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $@ $^
$(OBJECTS): $(SOURCES) $(HEADERS)