Kuinka palauttaa useita arvoja Delphi-toiminnosta

Yleisin konstrukti Delfoi sovellus olisi a menettely tai toiminto. Rutiineina, proseduureina tai funktioina kutsutaan lausekkeen lohkoja, jotka soitetaan ohjelman eri paikoista.

Yksinkertaisesti sanottuna menettely on rutiini, jolla arvoa ei palauteta, kun funktio palauttaa arvon.

Palautusarvo funktiosta määritetään paluutyypillä. Useimmissa tapauksissa kirjoitat funktion palauttaa yhden arvon se olisi kokonaisluku, merkkijono, boolean tai jokin muu yksinkertainen tyyppi, myös paluutyypit voivat olla taulukko, merkkijono, mukautetun objektin esiintymä tai vastaava.

Huomaa, että vaikka toiminto palauttaa merkkijonojen luettelon (kokoelma jouset) se palauttaa silti yhden arvon: yhden merkkijonoluettelon esiintymän.

Lisäksi Delphi-rutiineilla voi todella olla monia kasvoja: rutiini, menetelmä, osoitin, tapahtuman edustaja, tuntematon menetelmä ...

Voiko toiminto palauttaa useita arvoja?

Ensimmäinen mieleen tuleva vastaus on ei, yksinkertaisesti siksi, että kun ajattelemme funktiota, ajattelemme yhtä palautusarvoa.

instagram viewer

Vastaus yllä olevaan kysymykseen on kuitenkin varmasti kyllä. Toiminto voi palauttaa useita arvoja. Katsotaanpa kuinka.

Var-parametrit

Kuinka monta arvoa seuraava funktio voi palauttaa, yksi tai kaksi?

toimia PositiveReciprocal (const arvoIn: kokonaisluku; var valueOut: real): boolean;

Toiminto ilmeisesti palauttaa boolen arvon (tosi tai epätosi). Entä toinen parametri "valueOut", joka on ilmoitettu "VAR" (muuttuja) -parametriksi?

Var parametrit siirretään funktiolle viittaamalla tarkoittaen, että jos toiminto muuttaa parametrin arvoa - muuttujaa kutsuttavassa koodilohossa -, funktio muuttaa parametriksi käytetyn muuttujan arvoa.

Tutustu yllä olevaan toimintaan seuraavasti:

toimia PositiveReciprocal (const arvoIn: kokonaisluku; var valueOut: real): boolean;

alkaa

 tulos: = arvoIn> 0;

jos tulos sitten valueOut: = 1 / valueIn;

pää;

"ValueIn" välitetään vakiona parametrina - toiminto ei voi muuttaa sitä, ja sitä käsitellään vain luku -tyyppisenä.

Jos "valueIn" tai suurempi kuin nolla, parametrille "valueOut" määritetään vastavuoroinen arvo "valueIn" ja toiminnon tulos on totta. Jos arvoIn on <= 0, funktio palauttaa väärän ja arvoa "OutOut" ei muuteta millään tavalla.

Tässä on käyttö:

var

 b: boolean;

 r: todellinen;

alkaa

 r: = 5;

 b: = positiivinen vastavuoroinen (1, r);

 //here:

 // b = totta (vuodesta 1> = 0)

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

 r: = 5;

 b: = positiivinen vastavuoroinen (-1, r);

 //here:

 // b = väärä (vuodesta -1 

pää;

Siksi PositiveReciprocal voi "palauttaa" 2 arvoa! Var-parametreilla voit saada rutiininomaisesti useamman kuin yhden arvon.

Poisparametrit

On toinen tapa määritellä viiteparametri - käyttämällä "out" -sanaa, kuten:

toimia PositiveReciprocalOut (const arvoIn: kokonaisluku; ulos valueOut: real): boolean;

alkaa

 tulos: = arvoIn> 0;

jos tulos sitten valueOut: = 1 / valueIn;

pää;

PositiveReciprocalOut-sovelluksen toteutus on sama kuin PositiveReciprocal-ohjelmassa, siinä on vain yksi ero: "valueOut" on OUT-parametri.

Parametrien ollessa "out", viitatun muuttujan "valueOut" alkuarvo hylätään.

Tässä on käyttö ja tulokset:

var

 b: boolean;

 r: todellinen;

alkaa

 r: = 5;

 b: = PositiveReciprocalOut (1, r);

 //here:

 // b = totta (vuodesta 1> = 0)

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

 r: = 5;

 b: = Positiivinen vastavuoroinen ulostulo (-1, r);

 //here:

 // b = väärä (vuodesta -1 

pää;

Huomaa, kuinka toisen puhelun yhteydessä paikallisen muuttujan "r" arvoksi asetetaan "0". Arvo "r" asetettiin arvoon 5 ennen funktion kutsua, mutta koska parametri ilmoitettiin "ulos", kun "r" saavuttanut funktion, arvo hylättiin ja parametrille asetettiin oletusarvo "tyhjä" (0 todellinen tyyppi).

Seurauksena on, että voit lähettää turvallisesti aloittamattomia muuttujia parametreille - jotain mitä sinun ei pitäisi tehdä "var" -parametreihin. Parametreja käytetään lähettämään jotain rutiinille, paitsi tässä "out" -parametreilla :), ja siksi epävirallisilla muuttujilla (joita käytetään VAR-parametreihin) voi olla outoja arvoja.

Palaatko ennätys?

Edellä mainitut toteutukset, joissa funktio palauttaisi useamman kuin yhden arvon, eivät ole mukavia. Toiminto palauttaa tosiasiallisesti yhden arvon, mutta palauttaa myös, paremmin sanottuna, muuttaa var / out-parametrien arvot.

Tästä syystä saatat harvoin käyttää viiteparametreja. Jos toiminnosta tarvitaan enemmän tuloksia, voit saada funktion palautuksen a tietuetyyppi muuttuja.

Harkitse seuraavaa:

tyyppi

 TLatitudeLongitude = ennätys

 Leveysaste: todellinen;

 Pituusaste: todellinen;

pää;

ja hypoteettinen toiminto:

toimia Missä minä olen(const townName: jono): TLatitudeLongitude;

Toiminto WhereAmI palauttaa Leveys-ja pituuspiiri tietylle kaupungille (kaupunki, alue, ...).

Toteutus olisi:

toimia Missä minä olen(const townName: jono): TLatitudeLongitude;

alkaa// etsi jonkin palvelun avulla "townName" ja määritä funktion tulos:

 tulos. Leveysaste: = 45.54;

 tulos. Pituusaste: = 18,71;

pää;

Ja tässä meillä on toiminto, joka palauttaa 2 todellista arvoa. Ok, se palauttaa yhden tietueen, mutta tietueessa on 2 kenttää. Huomaa, että sinulla voi olla erittäin monimutkainen tietue, joka sekoittaa erilaisia ​​tyyppejä palautettaviksi toiminnon seurauksena.

Se siitä. Siksi, kyllä, Delphi-toiminnot voivat palauttaa useita arvoja.