Как вернуть несколько значений из функции Delphi

Наиболее распространенная конструкция в Delphi приложение будет процедура или функция. Известные как подпрограммы, процедуры или функции - это блоки операторов, которые вы вызываете из разных мест в программе.

Проще говоря, процедура - это процедура, не возвращающая значение, в то время как функция возвращает значение.

Возвращаемое значение из функции определяется типом возвращаемого значения. В большинстве случаев вы бы написали функцию вернуть единственное значение это может быть целое число, строка, логический или некоторый другой простой тип, а также возвращаемые типы могут быть массивом, списком строк, экземпляром пользовательского объекта или подобным.

Обратите внимание, что даже если ваша функция возвращает список строк (набор строки) он по-прежнему возвращает одно значение: один экземпляр списка строк.

Кроме того, подпрограммы Delphi действительно могут иметь много граней: рутина, метод, указатель метода, делегат события, анонимный метод ...

Может ли функция возвращать несколько значений?

instagram viewer

Первый ответ, который приходит на ум, - нет, просто потому, что когда мы думаем о функции, мы думаем об одном возвращаемом значении.

Конечно, ответ на поставленный выше вопрос, однако, да. Функция может возвращать несколько значений. Посмотрим как.

Параметры Var

Сколько значений может вернуть следующая функция, одно или два?

функция PositiveReciprocal (Const valueIn: целое число; вар valueOut: real): логическое значение;

Функция, очевидно, возвращает логическое значение (true или false). Как насчет второго параметра «valueOut», объявленного как «VAR» (переменный) параметр?

Вар параметры передаются в функцию по ссылке Это означает, что если функция изменяет значение параметра - переменную в вызывающем блоке кода - функция изменит значение переменной, используемой для параметра.

Чтобы увидеть, как работает выше, вот реализация:

функция PositiveReciprocal (Const valueIn: целое число; вар valueOut: real): логическое значение;

начать

 результат: = valueIn> 0;

если результат тогда valueOut: = 1 / значение In;

конец;

Значение valueIn передается как постоянный параметр - функция не может его изменить, и оно обрабатывается только для чтения.

Если «valueIn» или больше нуля, параметру «valueOut» присваивается обратное значение «valueIn», и результат функции равен true. Если valueIn <= 0, то функция возвращает false и значение «valueOut» никак не изменяется.

Вот использование:

вар

 б: логическое значение;

 р: реальный;

начать

 r: = 5;

 b: = PositiveReciprocal (1, r);

 //here:

 // b = true (так как 1> = 0)

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

 r: = 5;

 b: = PositiveReciprocal (-1, r);

 //here:

 // b = false (так как -1 

конец;

Следовательно, PositiveReciprocal действительно может «возвращать» 2 значения! Используя параметры var, вы можете иметь подпрограмму, возвращающую более одного значения.

Выходные параметры

Есть еще один способ указать параметр ссылки: с помощью ключевого слова out, например:

функция PositiveReciprocalOut (Const valueIn: целое число; вне valueOut: real): логическое значение;

начать

 результат: = valueIn> 0;

если результат тогда valueOut: = 1 / значение In;

конец;

Реализация PositiveReciprocalOut такая же, как и в PositiveReciprocal, есть только одно отличие: «valueOut» является параметром OUT.

С параметрами, объявленными как "out", начальное значение ссылочной переменной "valueOut" отбрасывается.

Вот использование и результаты:

вар

 б: логическое значение;

 р: реальный;

начать

 r: = 5;

 b: = PositiveReciprocalOut (1, r);

 //here:

 // b = true (так как 1> = 0)

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

 r: = 5;

 b: = PositiveReciprocalOut (-1, r);

 //here:

 // b = false (так как -1 

конец;

Обратите внимание, что во втором вызове значение локальной переменной «r» устанавливается в «0». Значение «r» было установлено равным 5 перед вызовом функции, но поскольку параметр in объявлен как «out», когда «r» достиг функции, значение было отброшено, и для параметра было установлено значение по умолчанию «пусто» (0 для реального тип).

В результате вы можете безопасно отправлять неинициализированные переменные для параметров out - то, что вы не должны делать с параметрами «var». Параметры используются для отправки чего-либо в подпрограмму, кроме случаев с параметрами out, поэтому неинициализированные переменные (используемые для параметров VAR) могут иметь странные значения.

Возвращать записи?

Вышеприведенные реализации, где функция будет возвращать более одного значения, не подходят. Функция на самом деле возвращает единственное значение, но также возвращает, лучше сказать изменяет, значения параметров var / out.

Из-за этого вы можете очень редко использовать параметры ссылки. Если требуется больше результатов от функции, вы можете получить функцию, возвращающую тип записи переменная.

Учтите следующее:

тип

 TLatitudeLongitude = запись

 Широта: реальная;

 Долгота: реальная;

конец;

и гипотетическая функция:

функция Где я(Const townName: строка): TLatitudeLongitude;

Функция WhereAmI будет возвращать Широта и долгота для данного города (города, района, ...).

Реализация будет:

функция Где я(Const townName: строка): TLatitudeLongitude;

начать// используем какой-то сервис для поиска "townName", затем присваиваем результат функции:

 результат. Широта = 45,54;

 результат. Долгота: = 18,71;

конец;

И здесь у нас есть функция, возвращающая 2 реальных значения. Хорошо, он возвращает 1 запись, но эта запись имеет 2 поля. Обратите внимание, что у вас может быть очень сложная запись, смешивающая различные типы, которые будут возвращены в результате функции.

Вот и все. Следовательно, да, функции Delphi могут возвращать несколько значений.

instagram story viewer