Delphi возврат из функции

Программирование Delphi

Все о программировании.

Массив как возврат функции и параметр метода

Массивы в Delphi позволяют нам обращаться к ряду переменных под одним именем и использовать индекс для обращения к определенной переменной.

В примере массив целых чисел, который содержит семь значений (целых чисел).

Обратите внимание , что этот установленный размер — это объявление статического массива в Delphi.

Массив как возврат функции

В Delphi функция — это подпрограмма, которая возвращает значение.

Если Вы хотите, чтобы функция возвратила переменную типа массив, Вы можете соблазниться использовать следующее объявление функции:

Когда Вы попробуете скомпилировать данный код, Вы получите следующую ошибку компиляции:

[Pascal Error] E2029 Identifier expected but ‘ARRAY’ found.

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

Чтобы позволить функции возвращать значение массива, Вы сначала должны создать тип массива, затем использовать его как возвращаемый тип функции, например:

Массив как свойство Метода/Подпрограммы

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

Здравствуй, дорогой читатель. Сегодня я планирую рассказать о таком значимом элементе программирования как функции. А если быть точным, будем разбирать функции Delphi.

Начнем с общего определения:

Функция – фрагмент программного кода, который имеет свое имя. По этому имени данный фрагмент можно вызвать из любого места программы. Результатом выполнения функции Delphi является значение.

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

Давайте разберем как определить функцию.

Итак, в начале идет ключевое слово function, затем имя функции. Далее в круглых скобках список параметров. Также необходимо указать тип возвращаемого результата. При необходимости можно определить локальные переменные. Между операторных скобок (begin..end;) необходимо записать требуемые инструкции.

В каждой функции Delphi автоматически создает переменную с именем result, переменная имеет тот же тип, что и возвращаемое значение функции. С помощью этой переменной мы и будем возвращать значения. (Есть еще одна возможность вернуть значение, её я продемонстрирую на примере).

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

Разберем применение функций Делфи на простом примере.

Создайте новое приложение и на форме разместите три кнопки (Button).

Далее откройте код и будем писать функцию, цель которой будет возвращать квадрат числа. Описание у нас будет вне класса после строк:

Это интересно:  Срочный трудовой договор заключение и расторжение

Сама же функция будет иметь следующий вид:

Название – square, параметр всего один – x типа Double, результат тоже будет Double.

Делфи позволяет возвращать значения через переменную, название которой совпадает с названием функции Delphi. В нашем случае это выглядит так: square:=x*x;(закомментированный код).

Теперь посмотрим как можно использовать написанный код. Напишем обработчик события Onclickдля каждой из кнопок.

  • Для первой кнопки — ShowMessage(FloatToStr(square(1)));
  • Для второй — ShowMessage(FloatToStr(square(2)));
  • Для третей — ShowMessage(FloatToStr(square(3)));

У меня получился следующий Unit

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

Подведем итог. Функции делают разработку на Делфи проще и быстрее, код читабельнее, правку проще. Используйте фунуции Delphi.

Получить из функции массив значений

При таком коде, в стринггрид вроде бы все норм записывается,но не тут то было — ерунда,данные совершенно беспорядочны, их больше не используешь, да и вообще если указать
result:=a[x]; вместо result:=a[1] цифры просто астрономические получаются.

Как правильно получить массив из функции,что бы потом можно было его использовать?
Пробовал указать в возвращаемеом значение массив, но что то недодумался как с ним работать..

получить таблицу значений функции
procedure TForm1.Button2Click(Sender: TObject); const a=2.5; dx=0.5; .

Получить таблицу из n значений функции ln(x)-x+1.8 на отрезке [2;3.5]
получить таблицу из n значений функции ln(x)-x+1.8 на отрезке

Напечатать массив Y значений функции
Ребята искренне извиняюсь, что пишу сюда. Необходимо сделать задание в: 1).

Дан массив А размера N. Получить массив В поменяв элементов массива А на обратный
Помогите пожалуйста! Дан массив А размера N. Получить массив В поменяв .

type TMyArray: array [1..5] of integer;

Если применять для возврата стандартный тип массива — будут проблемы, если объявишь свой — их не будет.

type TMyArray: array [1..5] of integer;

Если применять для возврата стандартный тип массива — будут проблемы, если объявишь свой — их не будет.

Хм. вобщем я пробовал уже. а что дальше делать с ним?
допустим result:=a[x];
если писать его в стринггрид ругается что несовместимые типы (мой массив arr) .

Кстати прочитал тут что вроде как функция не может возвратить массив — это так?

Да точно. 0 вместо 1.В принципе ошибку понял,но все одно хрень получается.
В стрингрид выводятся рандомные данные, но работать с ними нельзя.

Может мне нужно получать не x:integer а a:Tarr?

type MyArray: array of integer;

function ololo:MyArray;
var arr:MyArray;
begin
result:=arr;
end;

и вообще, помойму чтобы редактировать данный в stringGrid надо goEditing:=true устанавливать.

тебе функция что должна вернуть? Integer? или Tarr.

ты пытаешься результату функции присвоить массивное значение. а сама функция возвращает только целое число

Это интересно:  Иск банк сетелем каско

В общем, я хотел в функции создать одномерный массив <1..5>, рандомно записать в него 5 чисел соответственно.
И уже в процедуре по клику вывести его в стринггрид, а так же некоторые другие вычисления.

Не понимаю как вытащить этот массив значений из функции.
Если в возвр. значении указывать integer,то

вроде работает,только не очень то понятен смысл цикла «for x:=» — хоть 1 из 1,хоть 2 из 4 ставь -все одно в стринггриде радномные цифры,как и надо.
Сам не понял что натворил) Видимо для каждой ячейки стринггрида цикл forx:= рандомит свою циферку.
Но это не то что мне нужно-это не массив,т.к. мне нужно еще найти в нем все значения больше 15.

если сделать так как посоветовал olegoner, то да я так делал. НО не понимаю как получить значения из массив-в стринггрид не выведешь,ругается что inttostr не может использовать этот аргумент (tarr). Присваивать переменным? d(integer):=my(a);

Процедуры и функции

Функция — это подпрограмма, т. е. последовательность инструкций, имеющая имя.

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

В общем виде инструкция обращения к функции выглядит так:

Переменная := Функция (Параметры) ;

  • переменная — имя переменной, которой надо присвоить значение, вычисляемое функцией;
  • Функция — имя функции, значение которой надо присвоить переменной;
  • Параметры — список формальных параметров, которые применяются для вычисления значения функции. В качестве параметров обычно используют переменные или константы.

Следует обратить внимание на то, что:

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

Delphi возврат из функции

Здравствуйте, Аноним, Вы писали:

А>как на паскале (в частности дельфи) возратить фунцкцией несколько (небольшое количество 3-4 значения).
А> Можно ли это сделать без указателей ?

Здравствуйте, Аноним, Вы писали:

А>как на паскале (в частности дельфи) возратить фунцкцией несколько (небольшое количество 3-4 значения).
А> Можно ли это сделать без указателей ?

К вышесказанному: либо пользуй var параметры.

Здравствуйте, Sinclair, Вы писали:

S>Я не помню, в какой версии Object Pascal это ввели. По-моему, это с D2.

по-моему — с первой или с Borland Pasclal 7.0.

Здравствуйте, , Вы писали:

А>как на паскале (в частности дельфи) возратить фунцкцией несколько (небольшое количество 3-4 значения).
А> Можно ли это сделать без указателей ?
вариант 1 — структура : см. тут

вариант 2 — var параметры:

вариант 3 — out параметры пользовать слово out вместо var а так — все как в предыдущем примере:

вариант 4 — аозвращать массив значений как — сам догадайся (hint: можно и через var и через out и скомбинировать )
вариант 5 — возвращать значение типа variant, которое генерируется так:

ограничение — все результаты должны быть совместимы с Variant.
плюсы — можно вернуть более сложный результат. типа так:

Это интересно:  Детское пособие до 15 лет на второго ребенка документы

ну. если мало — еще добавим

Как вернуть массив из функции Delphi?

У меня есть функция в моем приложении, которая должна возвращать массив. Я нашел в нескольких местах, как это сделать, объявив тип массива, например.

И затем объявив мою функцию

Моя проблема заключается в том, чтобы установить это в форме, которая имеет как интерфейс, так и реализацию. Как объявить мой тип и объявить функцию с этим типом в интерфейсе?

Золотое правило заключается в том, что раздел интерфейса устройства описывает типы данных, используемые устройством, а также типы, классы и функции (их подписи), которые находятся в модуле. Это то, что видят все остальные единицы. Раздел реализации содержит реализацию классов и функций. Это не видно единицам ohter. Другие устройства должны заботиться о интерфейсе устройства, «контракте», подписанном данным устройством, и внешнем блоке, а не «деталях реализации», найденных в разделе реализации.

Если вы Delphi довольно недавно, вам не нужно объявлять новый тип, объявив его как TArray .

Пример скопирован и вставлен из приведенного выше ответа:

Процедуры и функции пользователя

Если в программе возникает необходимость частого обращения к некоторой группе операторов, то рационально сгруппировать такую группу операторов в самостоятельный блок, к которому можно обращаться, указывая его имя. Такие разработанные программистом самостоятельные программные блоки называются подпрограммами пользователя. Они являются основой модульного программирования. Разбивая задачу на части и оформляя логически обособленные модули в виде процедур и функций, программист реализует основные принципы широко используемого в практике системного подхода и методов нисходящего программирования.

При вызове подпрограммы (процедуры или функции), определенной программистом, работа главной программы на некоторое время приостанавливается и начинает выполняться вызванная подпрограмма. Она обрабатывает данные, переданные ей из главной программы. По завершении выполнения подпрограмма-функция возвращает главной программе результат (подпрограмма-процедура не возвращает явно результирующего значения).

Описание процедуры включает заголовок (имя) и тело процедуры. Заголовок состоит из зарезервированного слова procedure, идентификатора (имени) процедуры и необязательного, заключенного в круглые скобки, списка формальных параметров с указанием типа каждого параметра. Имя процедуры – идентификатор, уникальный в пределах программы. Тело процедуры представляет собой локальный блок, по структуре аналогичный программе.

Описания меток, констант, типов и т.д. действительны только в пределах данной процедуры. В теле процедуры можно использовать любые глобальные константы и переменные.

procedure (Формальные параметры);

Функция, определенная пользователем, состоит из заголовка и тела функции. Заголовок содержит зарезервированное слово function, идентификатор (имя) функции, заключенный в круглые скобки, необязательный список формальных параметров и тип возвращаемого функцией значения. Тело функции представляет собой локальный блок, по структуре аналогичный программе:

function (Формальные параметры) : тип результата;

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

Обращение к функции осуществляется по имени с необязательным указанием списка аргументов. Каждый аргумент должен соответствовать формальным параметрам, указанным в заголовке, и иметь тот же тип.