Возрат нескольких значений через функцию

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

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

Возрат нескольких значений через функцию

Сообщение Xenar » 02.09.2014 17:01:20

Доброго времени суток

В своем проекте вынес в отдельную библиотеку некий фунционал. В библиотеке оформил его в функцию результат вычислений которой состоит из нескольких значений типа Currency и Strung.
Возращаю эти значения в основную программу через Record
Что то типа
в библиотеке:
Код: Выделить всё
type
rec=record
  i1:Integer;
  i2:Integer;
end;

function SOMessage(send1,send2: Integer) : rec;
begin
result.i1:=send1+send2;
result.i2:=5*6;
end;
exports SOMessage;


В основной программе
Код: Выделить всё
type
rec=record
  i1:Integer;
  i2:Integer;
end;

function SOMessage(send1,send2: Integer) : rec; external 'libproject1.so';

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:= IntToStr(SOMessage(1,8).i1);
end;


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

То есть не только результат выполнения в библиотечной функции i1 но и i2 (как можно видеть результат i2 считается в любом случае)

Конечно можно сделать так:
Edit1.Text:= IntToStr(SOMessage(1,8).i1);
Edit2.Text:= IntToStr(SOMessage(1,8).i2);

Но тут получится два отдельных обращения к функции а она (функция) в моем случае очень "тяжелая" по выполнению и поэтому нужно получить все значения за один проход.
Аватара пользователя
Xenar
постоялец
 
Сообщения: 158
Зарегистрирован: 08.06.2011 12:54:07

Re: Возрат нескольких значений через функцию

Сообщение Лекс Айрин » 02.09.2014 18:24:53

рекурсивно, неа?

вообще, можно вывести по глобальной ссылке на список переменных.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Возрат нескольких значений через функцию

Сообщение Sharfik » 02.09.2014 18:29:38

Читай... http://www.delphibasics.ru/Record.php
Аналогично у тебя будет.
Код: Выделить всё
fruit := SOMessage(1,8);
Edit1.Text:= IntToStr(fruit .i1);
Edit2.Text:= IntToStr(fruit .i2);

Должно работать, не проверял.

Либо выделением памяти под Record и передачей адреса памяти. Но если Память в Dll выделяется,то программа может не увидеть эту область, нужно заранее передать твоей dll адрес памяти созданный в программе.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 809
Зарегистрирован: 20.07.2013 01:04:30

Re: Возрат нескольких значений через функцию

Сообщение Xenar » 02.09.2014 20:06:29

Sharfik писал(а):Читай... http://www.delphibasics.ru/Record.php
Аналогично у тебя будет.
Код: Выделить всё
fruit := SOMessage(1,8);
Edit1.Text:= IntToStr(fruit .i1);
Edit2.Text:= IntToStr(fruit .i2);

Должно работать, не проверял.

Спасибо огромное, сработал этот вариант
единственно что потребовалось (может кому понадобится) несколько изменить в основной программе

Код: Выделить всё
type
Trec=record
  i1:Integer;
  i2:Integer;
end;

var
rec : Trec; 

function SOMessage(send1,send2: Integer) : Trec; external 'libproject1.so';


procedure TForm1.Button1Click(Sender: TObject);
begin
rec:= SOMessage(1,8);
Edit1.Text:= IntToStr(rec.i1);
Edit1.Text:= IntToStr(rec.i2);
end;
Аватара пользователя
Xenar
постоялец
 
Сообщения: 158
Зарегистрирован: 08.06.2011 12:54:07

Re: Возрат нескольких значений через функцию

Сообщение Vapaamies » 02.09.2014 20:44:40

Еще можно с with написать, он анонимную переменную создаст. Как раз для таких случаев предусмотрено:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
  with SOMessage(1,8) do
  begin
    Edit1.Text:= IntToStr(i1);
    Edit1.Text:= IntToStr(i2);
  end;
end;
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Возрат нескольких значений через функцию

Сообщение Sharfik » 02.09.2014 22:07:34

Про анонимную переменную не знаю, знаю что читать код после его применения адское занятие. Лучше уж переменную временную объявить и хоть понятная логика будет.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 809
Зарегистрирован: 20.07.2013 01:04:30

Re: Возрат нескольких значений через функцию

Сообщение Vapaamies » 04.09.2014 11:18:24

Sharfik писал(а):читать код после его применения адское занятие.

Вот именно поэтому нужно применять with в простых случаях вроде этого.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 237

Рейтинг@Mail.ru
cron