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