Kako vratiti više vrijednosti iz Delphi funkcije

click fraud protection

Najčešći konstrukt u a Delphi prijava bi bila a postupak ili funkcija. Poznati kao rutine, postupci ili funkcije blokovi izjava koje zovete s različitih mjesta u programu.

Jednostavno rečeno, postupak je rutina koja ne vraća vrijednost dok funkcija vraća vrijednost.

Povratna vrijednost funkcije određena je tipom povratka. U većini slučajeva biste napisali funkciju vratiti jednu vrijednost to bi bio cijeli broj, niz, boolean ili neki drugi jednostavan tip, također bi tipovi povratka mogli biti niz, popis niza, instancija prilagođenog objekta ili slično.

Imajte na umu da čak i ako vaša funkcija vraća popis niza (zbirka od žice) i dalje vraća jednu vrijednost: jednu instancu popisa niza.

Nadalje, Delphi rutine zaista mogu imati mnoga lica: rutinu, metodu, pokazivač metoda, delegat događaja, anonimnu metodu ...

Može li funkcija vratiti više vrijednosti?

Prvi odgovor koji nam pada na pamet je ne, jednostavno zato što kada razmišljamo o funkciji, mislimo na jednu povratnu vrijednost.

Dakako, odgovor na gornje pitanje je, ipak, da. Funkcija može vratiti nekoliko vrijednosti. Da vidimo kako.

instagram viewer

Var Parametri

Koliko vrijednosti može vratiti sljedeća funkcija, jednu ili dvije?

funkcija PositiveReciprocal (const valueIn: cijeli broj; var valueOut: real): boolean;

Funkcija očito vraća bulovu vrijednost (true ili false). Što je s drugim parametrom "valueOut" deklariranim kao "VAR" (varijabla) parametar?

Var parametri prenose se u funkciju prema referenci što znači da ako funkcija promijeni vrijednost parametra - varijabla u bloku klica koji se zove - funkcija će promijeniti vrijednost varijable koja se koristi za parametar.

Da biste vidjeli kako gore opisano, evo implementacije:

funkcija PositiveReciprocal (const valueIn: cijeli broj; var valueOut: real): boolean;

početi

 rezultat: = valueIn> 0;

ako proizlaziti zatim valueOut: = 1 / valueIn;

kraj;

"ValueIn" se prenosi kao konstantan parametar - funkcija je ne može mijenjati i tretira se kao samo za čitanje.

Ako je "valueIn" ili veća od nule, parametru "valueOut" dodjeljuje se recipročna vrijednost "valueIn", a rezultat funkcije je istina. Ako je vrijednostIn <= 0, tada funkcija vraća false i "valueOut" se ne mijenja na bilo koji način.

Evo uporabe:

var

 b: boolov;

 r: pravi;

početi

 r: = 5;

 b: = pozitivni uzajamni (1, r);

 //here:

 // b = true (budući da je 1> = 0)

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

 r: = 5;

 b: = Pozitivni uzajamni (-1, r);

 //here:

 // b = lažno (od -1 

kraj;

Stoga PozitivniReciprokal zapravo može "vratiti" 2 vrijednosti! Koristeći parametre var možete rutinski vratiti više od jedne vrijednosti.

Izvan parametara

Postoji još jedan način da odredite referentni parametar - koristeći ključnu riječ "van", kao u:

funkcija PositiveReciprocalOut (const valueIn: cijeli broj; van valueOut: real): boolean;

početi

 rezultat: = valueIn> 0;

ako proizlaziti zatim valueOut: = 1 / valueIn;

kraj;

Implementacija PozitiveReciprocalOut ista je kao u PozitiveReciprocal, postoji samo jedna razlika: "valueOut" je parametar OUT.

Sa parametrima koji su deklarirani kao "van" početna vrijednost referentne varijable "valueOut" se odbacuje.

Evo uporabe i rezultata:

var

 b: boolov;

 r: pravi;

početi

 r: = 5;

 b: = PositiveReciprocalOut (1, r);

 //here:

 // b = true (budući da je 1> = 0)

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

 r: = 5;

 b: = PositiveReciprocalOut (-1, r);

 //here:

 // b = lažno (od -1 

kraj;

Napominjemo kako je u drugom pozivu vrijednost lokalne varijable "r" postavljena na "0". Vrijednost "r" je postavljena na 5 prije poziva funkcije, ali budući da je parametar u deklariranom kao "vani", kada je "r" dostigao funkciju vrijednost je odbačena i zadana vrijednost "prazno" za parametar (0 za stvarno tip).

Kao rezultat, možete sigurno poslati neinicijalizirane varijable za vanjske parametre - nešto što ne biste trebali učiniti s "var" parametrima. Parametri se koriste za slanje nečega u rutinu, osim ovdje s "out" parametrima :), pa bi neinicijalizirane varijable (koje se koriste za VAR parametre) mogle imati čudne vrijednosti.

Povratak zapisa?

Gornje implementacije u kojima bi funkcija vratila više od jedne vrijednosti nisu lijepe. Funkcija zapravo vraća jednu vrijednost, ali također vraća, bolje reći, promjene, vrijednosti var / out parametara.

Zbog toga ćete vrlo rijetko htjeti koristiti referentne parametre. Ako je potrebno više rezultata funkcije, možete imati povratak funkcije a vrsta zapisa promjenjiva.

Razmotrite sljedeće:

tip

 TLatitudeLongitude = snimiti

 Zemljopisna širina: stvarna;

 Dužina: stvarna;

kraj;

i hipotetička funkcija:

funkcija Gdje sam(const townName: niz): TLatitudeLongitude;

Funkcija WhereAmI bi vratila Zemljopisna širina i dužina za određeni grad (grad, područje, ...).

Provedba bi bila:

funkcija Gdje sam(const townName: niz): TLatitudeLongitude;

početi// pomoću neke usluge pronađite "townName", a zatim dodijelite rezultat funkcije:

 proizlaziti. Zemljopisna širina: = 45,54;

 proizlaziti. Dužina: = 18,71;

kraj;

I ovdje imamo funkciju koja vraća 2 stvarne vrijednosti. Ok, on vraća 1 zapis, ali ovaj zapis ima 2 polja. Napominjemo da možete imati vrlo složen zapis koji miješa različite vrste koje se vraćaju kao rezultat funkcije.

To je to. Stoga, da, funkcije Delphi mogu vratiti više vrijednosti.

instagram story viewer