Kako vrniti več vrednosti iz funkcije Delphi

Najpogostejši konstrukt v a Delphi prijava bi bila a postopek ali funkcijo. Znane kot rutine, postopki ali funkcije so bloki izjav, ki jih pokličete z različnih mest v programu.

Preprosto povedano, postopek je rutina, ki ne vrača vrednosti, medtem ko funkcija vrne vrednost.

Povratna vrednost funkcije je določena z vrsto vrnitve. V večini primerov bi napisali funkcijo vrne eno samo vrednost to bi bilo celo število, niz, boolean ali kakšen drug preprost tip, povratni tipi pa bi lahko bili niz, seznam nizov, primerek predmeta po meri ali podobno.

Upoštevajte, da tudi če funkcija vrne seznam nizov (zbirko strune) še vedno vrne eno samo vrednost: en primerek seznama nizov

Delphi rutine imajo lahko res veliko obrazov: rutina, metoda, kazalec metode, delegat dogodka, anonimna metoda ...

Ali lahko funkcija vrne več vrednosti?

Prvi odgovor, ki nam pade na pamet, je ne, preprosto zato, ker ko pomislimo na funkcijo, pomislimo na eno samo povratno vrednost.

Seveda je odgovor na zgornje vprašanje vendar, da. Funkcija lahko vrne več vrednosti. Poglejmo, kako.

instagram viewer

Parametri Var

Koliko vrednosti lahko vrne naslednja funkcija, eno ali dve?

funkcijo Pozitivno vzajemno (konst valueIn: celo število; var valueOut: real): boolean;

Funkcija očitno vrne logično vrednost (resnično ali napačno). Kaj pa drugi parameter "valueOut", deklariran kot parameter "VAR" (spremenljivka)?

Parametri Var se prenesejo v funkcijo s sklicevanjem kar pomeni, da če funkcija spremeni vrednost parametra - spremenljivko v klicnem bloku kode -, bo funkcija spremenila vrednost spremenljivke, uporabljene za parameter.

Če želite videti, kako zgoraj navedeno deluje, tukaj je izvedba:

funkcijo Pozitivno vzajemno (konst valueIn: celo število; var valueOut: real): boolean;

začeti

 rezultat: = valueIn> 0;

če rezultat torej valueOut: = 1 / valueIn;

konec;

"ValueIn" je podan kot stalni parameter - funkcija ga ne more spremeniti in se obravnava kot samo za branje.

Če je vrednost "valueIn" ali večja od nič, je parametru "valueOut" dodeljena vzajemna vrednost "valueIn" in rezultat funkcije je resničen. Če je vrednostIn <= 0, funkcija vrne false, "valueOut" pa na noben način ne spremeni.

Tukaj je uporaba:

var

 b: boolov;

 r: resnično;

začeti

 r: = 5;

 b: = pozitivno vzajemno (1, r);

 //here:

 // b = res (od 1> = 0)

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

 r: = 5;

 b: = pozitivno vzajemno (-1, r);

 //here:

 // b = napačno (od -1 

konec;

Zato lahko PositiveReciprocal dejansko "vrne" 2 vrednosti! Z uporabo parametrov var lahko rutinsko vrnete več kot eno vrednost.

Out Parameters

Obstaja še en način, kako določiti referenčni parameter - s pomočjo ključne besede "ven", kot je v:

funkcijo PositiveReciprocalOut (konst valueIn: celo število; ven valueOut: real): boolean;

začeti

 rezultat: = valueIn> 0;

če rezultat torej valueOut: = 1 / valueIn;

konec;

Izvajanje PositiveReciprocalOut je enako kot v PositiveReciprocal, obstaja samo ena razlika: "valueOut" je parameter OUT.

S parametri, označenimi kot "out", se začetna vrednost referenčne spremenljivke "valueOut" zavrže.

Tukaj je uporaba in rezultati:

var

 b: boolov;

 r: resnično;

začeti

 r: = 5;

 b: = pozitivno vzajemno (1, r);

 //here:

 // b = res (od 1> = 0)

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

 r: = 5;

 b: = PozitivniReciprocalOut (-1, r);

 //here:

 // b = napačno (od -1 

konec;

Upoštevajte, kako je v drugem klicu vrednost lokalne spremenljivke "r" nastavljena na "0". Vrednost "r" je bila pred klicem funkcije nastavljena na 5, ker pa je parameter v deklaraciji "zunaj", ko je "r" dosegla funkcijo, vrednost je bila zavržena in za parameter je bila nastavljena privzeta "prazna" vrednost (0 za resnično) tip).

Kot rezultat, lahko varno pošljete neinicializirane spremenljivke za zunanje parametre, kar ne bi smeli storiti s parametri "var". Parametri se uporabljajo za pošiljanje nečesa v rutino, razen tukaj s "out" parametri :), zato bi lahko neinicializirane spremenljivke (uporabljene za parametre VAR) imele čudne vrednosti.

Vračanje zapisov?

Zgornje izvedbe, pri katerih bi funkcija vrnila več kot eno vrednost, niso lepe. Funkcija dejansko vrne eno samo vrednost, ampak tudi vrne, bolje rečeno, spremeni vrednosti var / out parametrov.

Zaradi tega boste morda zelo redko želeli uporabiti referenčne parametre. Če je potrebnih več rezultatov funkcije, lahko vrnete funkcijo a vrsta zapisa spremenljivka.

Upoštevajte naslednje:

tip

 TLatitudeLongitude = zapis

 Širina: resnično;

 Dolžina: resnična;

konec;

in hipotetična funkcija:

funkcijo Kje sem(konst mestoName: vrvica): TLatitudeLongitude;

Funkcija WhereAmI bi vrnila Zemljepisna širina in dolžina za dano mesto (mesto, območje, ...).

Izvajanje bi bilo:

funkcijo Kje sem(konst mestoName: vrvica): TLatitudeLongitude;

začeti// s pomočjo neke storitve poiščite "townName" in dodelite rezultat funkcije:

 rezultat. Širina: = 45,54;

 rezultat. Dolžina: = 18,71;

konec;

In tu imamo funkcijo, ki vrača 2 resnični vrednosti. Ok, vrne 1 zapis, vendar ima ta zapis 2 polja. Upoštevajte, da imate lahko zelo kompleksen zapis, ki meša različne vrste, ki se vrnejo kot rezultat funkcije.

To je to. Zato ja, funkcije Delphi lahko vrnejo več vrednosti.