středa 30. června 2010

C/C++: Funkce a její návratová hodnota

Velice užitečné je si u funkcí, které nemusí dopadnout jak se od nich na první pohled čeká, vracet zda vše proběhlo v pořádku.

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