Személyes eszközök
Keresés

 

A InfoWiki wikiből


Több értékkel visszatérő függvények

Amennyiben valamely függvényünk nem egy, hanem mindjárt kettő vagy több értéket is előállít, úgy első pillantásra reménytelen helyzetbe kerülünk. A függvények ugyanis vagy nulla darab (void), vagy egy darab (adott típusú) értékkel képesek csak visszatérni, több visszatérési értékkel nem!

Felmerült egyszer a megoldási lehetőségek boncolgatása közben, hogy egymás után több return-t is adjunk ki a függvényben, így oldjuk meg a több értékes visszatérést. A return-ból többet lehet írni egy függvény törzsébe, de ezek közül csak az egyik hajtódhat végre konkrét lefutáskor. Az első return hatására ugyanis a függvény futása azonnal befejeződik, és visszatérünk a hívás helyére.

A több értékkel visszatérés egyik (legprimitívebb) megközelítésében egy (a legfontosabb) értéket a függvény adja vissza, a többi értéket visszatérése előtt helyezze el globális statikus változókba, ahonnan a hívó kód ki tudja (utólag bármikor) olvasni.

Másik lehetséges megoldás, hogy kimenő (out) vagy átmenő (ref) paramétereken keresztül adunk vissza értékeket (ezekből tetszőlegesen sokat).

Több érték visszaadása vektorral

Lehetőség van azonban olyan függvény írására is, amely nem egyszerű, hanem összetett adattípusú visszatérési értékkel rendelkezik (pl. tömb, lista, rekord).

static int[] megszamol(int[] t)
{
  int[] r = new int[2];
  foreach(int x in t)
  {
    if (x%2==0 && x>20) r[0]++;
    if (x%2==1 && x<30) r[1]++;
  }
  return r;
}

Ebben a példában egyszerre számoltuk meg a páros és 20-nál nagyobb elemek számát, illetve a páratlan és 30-nál kisebb elemek számát. A visszatérés során egy kételemű vektort (pontosabban annak memóriacímét) adjuk vissza. Hívása:

int[] l = new int[30];
for(int i=0;i<l.Length;i++) 
  l[i]=rnd.Next(10,100);
 
int[] k = megszamol(l);
Console.WriteLine("paros, nagyobb 20 => {0}",k[0]);
Console.WriteLine("paratlan, kisebb 20 => {0}",k[1]);

Több érték visszaadása listával

Amennyiben nem tömbbel, hanem listával dolgozunk, a megoldás menete nagyon hasonló:

static List<int> megszamol(int[] t)
{
  List<int> r = new List<int>();
  int db1=0;
  int db2=0;
  foreach(int x in t)
  {
    if (x%2==0 && x>20) db1++;
    if (x%2==1 && x<30) db2++;
  }
  r.Add(db1);
  r.Add(db2);
  return r;
}

Hívása:

int[] l = new int[30];
for(int i=0;i<l.Length;i++) 
  l[i]=rnd.Next(10,100);
 
List<int> k = megszamol(l);
Console.WriteLine("paros, nagyobb 20 => {0}",k[0]);
Console.WriteLine("paratlan, kisebb 20 => {0}",k[1]);


Hernyák Zoltán
A lap eredeti címe: „http://wiki.ektf.hu/wiki/Mp1/page540
Nézetek
nincs sb_3.234.221.162 cikk