Kuidas Delphi-funktsioonilt mitu väärtust tagastada

Kõige tavalisem konstruktsioon a-s Delphi rakendus oleks a protseduur või funktsioon. Rutiinidena tuntud protseduurid või funktsioonid on avalduse plokid, millele helistate programmi erinevatest asukohtadest.

Lihtsamalt öeldes on protseduur rutiin, mis ei tagasta väärtust, kui funktsioon annab väärtuse.

Funktsiooni tagastatav väärtus on määratletud tagastamise tüübiga. Enamikul juhtudel kirjutaksite funktsiooni tagastab ühe väärtuse see oleks täisarv, string, tõeväärtus või mõni muu lihtne tüüp, tagastamise tüübid võivad olla ka massiiv, stringiloend, kohandatud objekti eksemplar või muu sarnane.

Pidage meeles, et isegi kui teie funktsioon tagastab stringide loendi ( keelpillid), tagastab see ikkagi ühe väärtuse: stringiloendi üks eksemplar.

Lisaks võib Delphi rutiinidel olla tõesti palju nägusid: rutiin, meetod, meetodi osutaja, sündmuse delegaat, anonüümne meetod ...

Kas funktsioon saab anda mitu väärtust?

Esimene vastus, mis pähe tuleb, on ei, lihtsalt sellepärast, et kui mõtleme funktsioonile, mõtleme ühele tagastatavale väärtusele.

instagram viewer

Kindlasti on vastus ülaltoodud küsimusele siiski jah. Funktsioon võib tagastada mitu väärtust. Vaatame kuidas.

Var parameetrid

Mitu väärtust võib järgmine funktsioon naasta, üks või kaks?

funktsiooni Positiivne vastastikune (const valueIn: täisarv; var valueOut: päris): tõeväärtus;

Funktsioon tagastab ilmselgelt tõeväärtuse (tõene või vale). Kuidas oleks teise parameetriga "valueOut", mis kuulutatakse parameetriks "VAR" (muutuja)?

Var parameetrid edastatakse funktsioonile viitena see tähendab, et kui funktsioon muudab parameetri väärtust - muutujat koodkõnes, - muudab funktsioon parameetri jaoks kasutatud muutuja väärtust.

Eespool kirjeldatu toimimise kohta leiate järgmist:

funktsiooni Positiivne vastastikune (const valueIn: täisarv; var valueOut: päris): tõeväärtus;

alustada

 tulemus: = väärtusIn> 0;

kui tulemus siis valueOut: = 1 / valueIn;

lõpp;

"ValueIn" antakse konstantse parameetrina - funktsioon ei saa seda muuta ja seda käsitletakse kirjutuskaitstud kujul.

Kui "valueIn" või suurem kui null, omistatakse parameetrile "valueOut" vastastikune väärtus "valueIn" ja funktsiooni tulemus on tõene. Kui väärtusIn on <= 0, tagastab funktsioon vale ja väärtust "valueOut" ei muudeta.

Siin on kasutusviis:

var

 b: loogiline;

 r: päris;

alustada

 r: = 5;

 b: = positiivne vastastikune suhe (1, r);

 //here:

 // b = tõene (kuna 1> = 0)

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

 r: = 5;

 b: = positiivne vastastikune suhe (-1, r);

 //here:

 // b = vale (kuna -1 

lõpp;

Seetõttu saab PositiveReciprocal tegelikult 2 väärtust "tagastada"! Var-parameetreid kasutades saate rutiinselt tagastada mitu väärtust.

Välja parameetrid

Kaasviiteparameetri määramiseks on veel üks viis - kasutades märksõna "välja", nagu näiteks:

funktsiooni Positiivne vastastikune väljavõte (const valueIn: täisarv; välja valueOut: päris): tõeväärtus;

alustada

 tulemus: = väärtusIn> 0;

kui tulemus siis valueOut: = 1 / valueIn;

lõpp;

PositiveReciprocalOut on sama, mis rakenduses PositiveReciprocal, ainult üks erinevus: "valueOut" on parameeter OUT.

Kui parameetrid on deklareeritud kui "out", siis viidatud muutuja "valueOut" algväärtus jäetakse kõrvale.

Siin on kasutus ja tulemused:

var

 b: loogiline;

 r: päris;

alustada

 r: = 5;

 b: = PositiveReciprocalOut (1, r);

 //here:

 // b = tõene (kuna 1> = 0)

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

 r: = 5;

 b: = positiivne vastastikune väljund (-1, r);

 //here:

 // b = vale (kuna -1 

lõpp;

Pange tähele, kuidas teises kõnes seatakse kohaliku muutuja "r" väärtuseks "0". Enne funktsioonikõnet seati "r" väärtuseks 5, kuid kuna parameeter deklareeriti kui "välja", kui "r" saavutas funktsiooni, väärtus jäeti kõrvale ja parameetri jaoks seati vaikimisi "tühi" väärtus (0 oli reaalne tüüp).

Selle tulemusel saate ohutult saata parameetrite jaoks algatamata muutujaid - midagi, mida te ei tohiks parameetritega "var" teha. Parameetreid kasutatakse millegi rutiini saatmiseks, välja arvatud siin parameetritega "out" :) ja seetõttu võivad initsialiseerimata muutujatel (mida kasutatakse VAR-i parameetrite jaoks) imelikud väärtused.

Kas naasete plaate?

Ülaltoodud rakendused, kus funktsioon tagastaks rohkem kui ühe väärtuse, pole toredad. Funktsioon tagastab tegelikult ühe väärtuse, kuid tagastab ka, õigemini öeldes, muudab parameetrite var / out väärtused.

Seetõttu võiksite väga harva kasutada võrdlusparameetreid. Kui funktsioonilt on vaja saada rohkem tulemusi, saate funktsiooni tagastada a kirje tüüp muutuja.

Mõelge järgmisele:

tüüp

 TLatitudeLongitude = rekord

 Laiuskraad: päris;

 Pikkuskraad: päris;

lõpp;

ja hüpoteetiline funktsioon:

funktsiooni Kus ma olen(const townName: nöör): TLatitudeLongitude;

Funktsioon WhereAmI tagastaks Laius ja pikkus antud linna (linn, piirkond, ...) jaoks.

Rakendamine oleks järgmine:

funktsiooni Kus ma olen(const townName: nöör): TLatitudeLongitude;

alustada// kasutage mõnda teenust "townName" leidmiseks, seejärel määrake funktsiooni tulemus:

 tulemus. Laiuskraad: = 45,54;

 tulemus. Pikkuskraad: = 18,71;

lõpp;

Ja siin on meil funktsioon, mis tagastab 2 tegelikku väärtust. Ok, see tagastab küll ühe kirje, kuid sellel kirjal on 2 välja. Pange tähele, et teil võib olla väga keeruline kirje, mis seob erinevaid tüüpe, mis tuleb funktsiooni tulemusel tagastada.

See selleks. Seega, jah, Delphi funktsioonid võivad tagastada mitu väärtust.