Személyes eszközök
Keresés

 

A InfoWiki wikiből

(Változatok közti eltérés)
(Új oldal, tartalma: „<cim cim3="Több értékkel visszatérő függvények" cim2="Magasszintű Programozási Nyelvek I." cim1="Imperatív, procedurális nyelvek alapjai" prev="mp1/page5...”)
(Több értékkel visszatérő függvények)
17. sor: 17. sor:
= Több értékkel visszatérő függvények =
= 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 lehetésges megoldása, 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).
 +
 +
<code lang="csharp">
 +
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;
 +
}
 +
</code>
 +
 +
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:
 +
 +
<code lang="csharp">
 +
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]);
 +
</code>
<alairas>Hernyák Zoltán</alairas>
<alairas>Hernyák Zoltán</alairas>
__NOTOC__
__NOTOC__

A lap 2009. december 5., 08:45-kori változata


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 lehetésges megoldása, 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]);
Hernyák Zoltán
A lap eredeti címe: „http://wiki.ektf.hu/wiki/Mp1/page540
Nézetek
nincs sb_3.19.29.89 cikk