Како вратити више вредности из Делпхи функције

Најчешћи конструкт у а Делпхи пријава би била поступак или функција. Познате као рутине, процедуре или функције су блокови изјава које позивате са различитих локација у програму.

Једноставно речено, поступак је рутина која не враћа вриједност док функција враћа вриједност.

Повратна вриједност функције дефинирана је типом повратка. У већини случајева бисте написали функцију вратити једну вредност то би био цели број, низ, боолеан или неки други једноставан тип, такође би типови повратка могли бити низ, списак низа, инстанца прилагођеног објекта или слично.

Имајте на уму да чак и ако ваша функција враћа листу низа (збирка од жице) и даље враћа једну вредност: једну инстанцу листе стрингова.

Надаље, Делпхи рутине заиста могу имати многа лица: рутину, метод, показивач метода, делегат догађаја, анонимни метод ...

Може ли функција вратити више вриједности?

Први одговор који нам пада на памет је не, једноставно зато што када размишљамо о функцији, мислимо на једну повратну вредност.

Свакако, одговор на горње питање је, ипак, да. Функција може вратити неколико вредности. Да видимо како.

instagram viewer

Вар Параметерс

Колико вриједности може вратити сљедећа функција, једну или двије?

функција ПоситивеРеципроцал (цонст валуеИн: цели број; вар валуеОут: реал): боолеан;

Функција очигледно враћа булову вредност (труе или фалсе). Како је са другим параметром "валуеОут" декларираним као "ВАР" (променљив) параметар?

Вар параметри се преносе у функцију по референци што значи да ако функција промијени вриједност параметра - варијабле у позивајућем блоку кода - функција ће промијенити вриједност варијабле која се користи за параметар.

Да бисте видели како горе наведено делује, ево примене:

функција ПоситивеРеципроцал (цонст валуеИн: цели број; вар валуеОут: реал): боолеан;

започети

 резултат: = валуеИн> 0;

ако резултат онда валуеОут: = 1 / валуеИн;

крај;

"ВалуеИн" се преноси као константан параметар - функција је не може изменити и третира се као само за читање.

Ако је вредност „валуеИн“ или већа од нуле, параметру „валуеОут“ додељена је реципрочна вредност „валуеИн“, а резултат функције је тачан. Ако је вредностИн <= 0, функција враћа лажну вредност, а вредност вредност није на било који начин измењена.

Ево употребе:

вар

 б: боолеан;

 р: реално;

започети

 р: = 5;

 б: = позитивни узајамни (1, р);

 //here:

 // б = тачно (од 1> = 0)

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

 р: = 5;

 б: = позитивни узајамни (-1, р);

 //here:

 // б = фалсе (од -1 

крај;

Према томе, позитивни реципрочни уствари могу „вратити“ 2 вредности! Користећи параметре вар можете рутински вратити више од једне вриједности.

Оут Параметерс

Постоји још један начин да одредите референтни параметар - користећи кључну реч "ван", као у:

функција ПоситивеРеципроцалОут (цонст валуеИн: цели број; напоље валуеОут: реал): боолеан;

започети

 резултат: = валуеИн> 0;

ако резултат онда валуеОут: = 1 / валуеИн;

крај;

Имплементација ПозитивеРеципроцалОут иста је као у ПозитивеРеципроцал, постоји само једна разлика: "валуеОут" је ОУТ параметар.

Са параметрима проглашеним као "ван", почетна вредност референциране променљиве "валуеОут" се одбацује.

Ево употребе и резултата:

вар

 б: боолеан;

 р: реално;

започети

 р: = 5;

 б: = ПоситивеРеципроцалОут (1, р);

 //here:

 // б = тачно (од 1> = 0)

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

 р: = 5;

 б: = ПоситивеРеципроцалОут (-1, р);

 //here:

 // б = фалсе (од -1 

крај;

Имајте на уму како је у другом позиву вредност локалне променљиве "р" постављена на "0". Вредност „р“ је постављена на 5 пре позива функције, али пошто је параметар у декларисаном „оут“, када „р“ достигао функцију, вредност је одбачена и задата вредност "празно" за параметар (0 за стварно тип).

Као резултат тога, можете сигурно послати неиницијализоване променљиве за ван параметре - нешто што не би требало да радите са "вар" параметрима. Параметри се користе за слање нечега у рутину, осим овде са "оут" параметрима :), па би неиницијализоване варијабле (које се користе за ВАР параметре) могле имати чудне вредности.

Враћање записа?

Горе наведене имплементације у којима би функција вратила више од једне вриједности нису згодне. Функција заправо враћа једну вриједност, али такођер враћа, боље рећи, промјене, вриједности вар / оут параметара.

Због тога ћете врло ријетко хтјети користити референтне параметре. Ако је потребно више резултата неке функције, можете имати функцију ретурн а врста записа променљива.

Узмите у обзир следеће:

тип

 ТЛатитудеЛонгитуде = запис

 Ширина: реално;

 Дужина: реална;

крај;

и хипотетичка функција:

функција Где сам ја(цонст градНаме: низ): ТЛатитудеЛонгитуде;

Функција ВхереАмИ би вратила Ширине и дужине за одређени град (град, подручје, ...).

Имплементација би била:

функција Где сам ја(цонст градНаме: низ): ТЛатитудеЛонгитуде;

започети// користите неку услугу да бисте пронашли "товнНаме", а затим додијелили резултат функције:

 резултат. Ширина: = 45.54;

 резултат. Дужина: = 18.71;

крај;

И овде имамо функцију која враћа 2 стварне вредности. Ок, враћа 1 запис, али овај запис има 2 поља. Имајте на уму да можете имати веома сложен запис који меша различите врсте које се враћају као резултат функције.

То је то. Стога, да, Делпхи функције могу вратити више вриједности.

instagram story viewer