Функция с двумя результами

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Функция с двумя результами

Сообщение qivi »

Можно ли сделать и если да то как функцию возвращающую два (или более) результа?
serg_iv
постоялец
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Сообщение serg_iv »

Насколько помню, организовывали когда то через адресный тип такую штуку.
BugMaker
новенький
Сообщения: 10
Зарегистрирован: 23.07.2011 22:26:56

Сообщение BugMaker »

Не тестировал, но как-то так все должно работать

Код: Выделить всё

program varparams;

Procedure test(input:integer; var output1, output2:integer);
begin
  output1:=input+6;
  output2:=input*2;
end;

var i,o1,o2:integer;
begin
  i:=7;
  test(i,o1,o2);
  writeln(o1);
  writeln(o2);
end.
.wOvAN
постоялец
Сообщения: 118
Зарегистрирован: 16.04.2010 06:36:12
Контактная информация:

Сообщение .wOvAN »

Код: Выделить всё

Type TDoubleResult=record
           Res1:Integer;
           Res2:Integer;
          End;
////
Function MagicResult(aBracadabra:Integer):TDoubleResult;
begin
  Result.Res1:=1;
  Result.Res2:=2;
end;
////
with MagicResult(1) do
 if ((Res1 = 1) and (Res2=2)) then BlaBlaBla;
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Спасибо за ответы, помогло.
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

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

Код: Выделить всё

function PYATNO(CenterPyatna:UTF8String):array of UTF8String; 

Ошибка:

Код: Выделить всё

f15_prostranstvo.pas(124,48) Error: Type identifier expected
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Код: Выделить всё

type
  TArr = array of String;

function PYATNO(CenterPyatna:UTF8String): TArr;
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Что такое : TArr;? Динамический? Тип строки?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

А разве не видно? :wink:
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Mr.Smart писал(а):А разве не видно? :wink:

Да пардон...

А как потом считывать этот массив, это будет работать:

Код: Выделить всё

NovoePyatnoZagruzki:=Copy(PYATNO(IDCenterZagruzki),0, High(PYATNO(IDCenterZagruzki)));


Да и правильно я понимаю что эта строка (выше) дважды вызовит функцию PYATNO? Можно это как то оптимизировать?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Можно

Код: Выделить всё

var
  tmp: TArr
begin
  tmp:=PYATNO(IDCenterZagruzki);
...
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Mr.Smart спасибо.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

qivi писал(а):А как потом считывать этот массив, это будет работать

Странный у вас код считывания :shock:

Код: Выделить всё

var
  tmp: TArr;
  j: Integer;
begin
....
  for j:=Low(tmp) to High(tmp) do
    tratata:=tmp[j];
....
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

А стоит ли крутить цикл, если массив можно просто скопировать?
Ответить