Több érték visszaadása egy Delphi függvényből

A leggyakoribb konstrukció a Delphi alkalmazás lenne a eljárás vagy funkció. Rutinnak, eljárásnak vagy függvénynek nevezzük azokat a mondat-blokkokat, amelyeket a program különböző helyéről hívunk.

Egyszerűen fogalmazva, az eljárás olyan rutin, amely nem ad vissza értéket, míg a függvény egy értéket ad vissza.

A függvény visszatérési értékét a visszatérés típusa határozza meg. A legtöbb esetben egy függvényt írna be egyetlen értéket ad vissza ez egész szám, karakterlánc, logikai vagy más egyszerű típus lehet, a visszatérési típusok tömb, karakterlánclista, egyéni objektum példányai is lehetnek.

Vegye figyelembe, hogy még akkor is, ha a függvény karakterlánclistát ad vissza ( húrok) továbbra is egyetlen értéket ad vissza: a karakterlánclista egy példányát.

Továbbá, a Delphi rutinoknak valóban sok arcuk lehet: rutin, módszer, módszer mutató, esemény delegált, névtelen módszer ...

Visszaadhat egy funkció több értéket?

Az első válasz, amelyre eszünkbe jut, nem, egyszerűen azért, mert amikor egy funkcióra gondolunk, akkor egyetlen visszatérési értékre gondolunk.

instagram viewer

Természetesen a fenti kérdésre a válasz: igen. Egy funkció több értéket adhat vissza. Lássuk, hogyan.

Var paraméterek

Hány értékre képes visszaadni a következő függvény, egy vagy kettőt?

funkció PositiveReciprocal (const valueIn: egész; var valueOut: real): logikai;

A függvény nyilvánvalóan boolean értéket ad vissza (igaz vagy hamis). Mi lenne a "valueOut" második paraméterrel, amelyet "VAR" (változó) paraméterként deklaráltak?

Var paraméterek átkerülnek a funkcióhoz hivatkozással ami azt jelenti, hogy ha a függvény megváltoztatja a paraméter értékét - egy változót a kód hívó blokkjában -, akkor a függvény megváltoztatja a paraméterhez használt változó értékét.

A fentiek működésének megismeréséhez a következőket kell végrehajtani:

funkció PositiveReciprocal (const valueIn: egész; var valueOut: real): logikai;

kezdődik

 eredmény: = értékIn> 0;

ha eredmény azután valueOut: = 1 / valueIn;

vég;

Az "valueIn" állandó paraméterként kerül átadásra - a funkció nem változtathatja meg, és csak olvashatóként kezelik.

Ha "valueIn" vagy nullánál nagyobb, akkor az "valueOut" paraméterhez az "valueIn" viszonossági értéke kerül hozzárendelésre, és a funkció eredménye igaz. Ha az value értéke <= 0, akkor a függvény hamis értéket ad vissza, és az "valueOut" semmilyen módon nem változik.

Itt van a használat:

var

 b: logikai;

 r: valódi;

kezdődik

 r: = 5;

 b: = pozitív kölcsönös (1, r);

 //here:

 // b = igaz (mivel 1> = 0)

 // r = 0,2 (1/5)

 r: = 5;

 b: = pozitív kölcsönös (-1, r);

 //here:

 // b = hamis (-1 óta 

vég;

Ezért a PositiveReciprocal valójában képes "visszaadni" 2 értéket! A var paraméterek használatával egynél több érték is visszatérhet rutinhoz.

Out paraméterek

Van egy másik módszer a referenciaparaméter meghatározására - a „ki” kulcsszó használatával, mint a következőkben:

funkció PositiveReciprocalOut (const valueIn: egész; ki valueOut: real): logikai;

kezdődik

 eredmény: = értékIn> 0;

ha eredmény azután valueOut: = 1 / valueIn;

vég;

A PositiveReciprocalOut megvalósítása ugyanaz, mint a PositiveReciprocal esetében, csak egy különbség van: a "valueOut" egy OUT paraméter.

A "out" -ként megadott paraméterekkel a hivatkozott "valueOut" változó kezdeti értékét el kell hagyni.

Itt van a használat és az eredmények:

var

 b: logikai;

 r: valódi;

kezdődik

 r: = 5;

 b: = PositiveReciprocalOut (1, r);

 //here:

 // b = igaz (mivel 1> = 0)

 // r = 0,2 (1/5)

 r: = 5;

 b: = PositiveReciprocalOut (-1, r);

 //here:

 // b = hamis (-1 óta 

vég;

Vegye figyelembe, hogy a második hívásban az "r" helyi változó értékét "0" -ra állítják. Az "r" értékét 5-re állították a funkcióhívás előtt, de mivel a paramétert "out" -nek deklarálták, amikor "r" elérte a funkciót, az értéket elvetik, és az alapértelmezett "üres" értéket állították be a paraméterre (0 a valós értékre típus).

Ennek eredményeként biztonságosan elküldheti az inicializálatlan változókat a kimeneti paraméterekhez - amit nem szabad a "var" paraméterekkel csinálni. A paraméterek arra szolgálnak, hogy valamit elküldjenek a rutinnak, kivéve itt a "ki" paramétereket :), ezért az inicializálatlan változók (a VAR paraméterekhez használva) furcsa értékeket tartalmazhatnak.

Visszaadja a lemezeket?

A fenti megvalósítások, ahol egy függvény egynél több értéket adna vissza, nem szépek. A függvény valóban egyetlen értéket ad vissza, de visszatér, mondhatjuk, megváltoztatja, a var / out paraméterek értékeit.

Emiatt nagyon ritkán érdemes használni a referencia-paramétereket. Ha egy funkcióból több eredményre van szükség, akkor a függvényt visszatérítheti a rekord típusa változó.

Tekintsük a következő:

típus

 TLatitudeLongitude = rekord

 Szélesség: valódi;

 Hosszúság: valódi;

vég;

és hipotetikus funkció:

funkció Hol vagyok(const townName: húr): TLatitudeLongitude;

A WhereAmI függvény visszaadja a Szélesség és hosszúság egy adott város (város, terület, ...) számára.

A végrehajtás a következő lenne:

funkció Hol vagyok(const townName: húr): TLatitudeLongitude;

kezdődik// használjon valamilyen szolgáltatást a "townName" megkereséséhez, majd rendelje el a függvény eredményét:

 eredmény. Szélesség: = 45,54;

 eredmény. Hosszúság: = 18.71;

vég;

És itt van egy olyan funkció, amely 2 valós értéket ad vissza. Oké, 1 rekordot ad vissza, de ennek a rekordnak 2 mezője van. Ne feledje, hogy nagyon bonyolult rekordokkal rendelkezhet, különféle típusokat keverve, amelyeket egy függvény eredményeként ad vissza.

Ez az. Ezért igen, a Delphi függvények több értéket adhatnak vissza.

instagram story viewer