Obecně se vrací TRUE při správném průběhu a FALSE pokud se vyskytne nějáká chyba. Při volání funkce, která vrácí takovouto hodnotu, můžeme na případnou chybu nějak zareagovat anebo ji předat zase v podobě návratové hodnoty o úroveň výše.
byte setX(byte x){ if (x>100) return 0; //chyba.. X lze nastavit jen v rozsahu 0-100 sGlobal.x = x; return 1; //ok }
Definujme podobně funkci byte setY(byte y);
Tyto dvě využijeme ve funkci pro nastavení x i y.
byte setXY(byte x, byte y){ if(setX(x)&&setY(y)) return 1; return 0; //chyba }
A konečně samotné nastavení x a y by mohlo vypadat nějak takhle..
if(setXY(a,b)){ //probehlo nastaveni v poradku? //ok - nejaky kod } else{ //chyba //osetreni chyby }
Potud si s TRUE a FALSE vystačím.
Když bych ale chtěl mít třeba funkci, která mi naplní buffer nějákými daty a vrátí mi i jejich délku, tak abych s nimi mohl dále pracovat, musel bych to zapsat nějak takhle.
byte getData1(byte *pBuffer, byte *length){ if(data.ready){ //naplneni bufferu *length = data.length; return 1; //ok } return 0; //chyba }
Raději ale volím úspornější tvar, kdy délku mi vrací sama funkce.
char getData2(byte *pBuffer){ if(data.ready){ //naplneni bufferu return data.legth; //ok } return -1; }
Nemohu zde vracet 0, resp. FALSE v případě chyby, protože 0 může být legitimní hodnota např. data nulové délky.
Použil jsem proto znaménkový typ char a pro chybu vyčlenil -1.
Tyto dva způsoby návratových hodnot, tedy 0:chyba, 1:ok a druhý -1:chyba, 0–127:ok se obě hojně používají.
Problém je, že vývojář musí návratové hodnoty použítých funkcí pozorně sledovat.
V prvním případě totiž je třeba funkci testovat na TRUE, v druhém na -1.
if(getData1(pBuffer, &length)){ //ok } else( //chyba )
if((length=getData2(pBuffer)) != -1){ //ok } else( //chyba )
Ve svých funkcích tedy používám kvůli jednotnosti druhý způsob i když to není nezbytně nutné. Co vracíte vy?
Žádné komentáře:
Okomentovat