Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Создание функции


Автор: LexaL 5.5.2011, 19:13
Подскажите пожалуйста, можно ли создать функцию возвращающую несколько параметров (2 и более)? Если можно, то так это сделать? За примеры, спасибо!

Автор: Данкинг 5.5.2011, 19:22
Можно: создавай свой тип и пиши функцию этого типа.

Автор: Galus 5.5.2011, 19:30
Не пробовал, и под рукой нет установленного Delphi, но возможно так:
Код

type
...
TArr = array of string;
...
function func(Arr1: TArr): TArr;
...
function TForm1.func(Arr1: TArr): TArr;
var
  i: integer;
begin
  for i = 0 to length(Arr1)-1 do Arr1[i] := Arr1[i] + inttostr(i);
  result := Arr1;
end;


Функция вернёт массив данных типа стринг, к каждому элементу которого будет добавлен в конец его порядковый номер.

Автор: northener 5.5.2011, 19:39
Цитата(LexaL @  5.5.2011,  19:13 Найти цитируемый пост)
Подскажите пожалуйста, можно ли создать функцию возвращающую несколько параметров

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

Автор: Snowy 5.5.2011, 19:40
Цитата(LexaL @  5.5.2011,  19:13 Найти цитируемый пост)
Подскажите пожалуйста, можно ли создать функцию возвращающую несколько параметров (2 и более)

Нельзя.
Но ты можешь передать переменные, как var параметры, чтобы функция их изменила.
Для переменного числа значений, можно передать функции список или динамический массив, чтобы она добавила туда записи.

Автор: bems 5.5.2011, 20:06
Цитата(LexaL @  5.5.2011,  19:13 Найти цитируемый пост)
Подскажите пожалуйста, можно ли создать функцию возвращающую несколько параметров (2 и более)?
out-параметры предназначены как раз для этого

Автор: Akella 5.5.2011, 20:27
можно использовать record, весьма удобно

Автор: LexaL 5.5.2011, 20:30
Нужно что бы возвращала трехмерный массив и три int переменных. Как в этом случае поступить?

Автор: Akella 5.5.2011, 21:09
в record запихай и массив и три переменных

Автор: LexaL 6.5.2011, 20:04
Подскажите пожалуйста, как правильно вернуть трехмерный массив. Result:= массив [] ?

Автор: Frees 6.5.2011, 21:38
сделать не функцию а класс

Автор: kuzyara 7.5.2011, 10:30
а вернуть *ссылку не прокатит?

Автор: Snowy 10.5.2011, 10:02
Стоит задуматься о проектировании.
Сам подход, когда функция возвращает какие-то сложные структуры или наборы данных - затея вредная для здоровья.
Как для здоровья программы, так и для здоровья разработчика, в случае, если он работает не один...
Если вам нужно получить трёхмерный массив, то создайте его, отдайте функции для заполнения, получите данные, избавьтесь от массива.
Данные должны порождаться и уничтожаться в одном и том же месте.
В пределах функции, класса, модуля. В зависимости от зоны видимости.

Вариант, когда данные порождаются, например в функции, а потом передаются куда-либо, это не есть хорошо.
Из данной ситуации следуют 2 варианта:
1. Данные уничтожаются автоматически, при выходе за границы видимости переменной (например функция вернула указатель, на локальную переменную).  Обычная ошибка, ведущая всего лишь к тому, что программа не работает.
2. Данные уничтожаются непонятно где, а скорее всего вообще нигде. Типичная для новичков утечка памяти.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)