Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблемма с созданием UDF. [D7, IB6.x]


|Denis| ©   (2005-01-05 11:53:00) 

Здравствуйте. Пытаюсь создать пользовательскую функцию. Вот содержание dll:

library my_lib1;
uses
 SysUtils,
 Classes;
{$R *.res}

function my_procent(seloe: integer; chast: integer): real48;
cdecl;
begin
result := chast*100/seloe ; //к примеру 1*100/2=50
end;

exports
my_procent;

begin
end.


Вот так объявляю её:

declare external function my_procent
smallint, smallint
returns float
entry_point 'my_procent'
module_name 'my_lib1.dll';


Таким запросом вызываю:

select my_procent (field1, field2) from table1


В итоге, к примеру, при следующих значениях:
Field1     Field2
4            2
10           3

Выдается столбец:
My_procent
2,90103422213275E-38
2,90103422213275E-38

Возникает закономерный вопрос: что не так?


|Denis|   (2005-01-06 22:04:00) [1]


> DSKalugin ©   (06.01.05 11:39) [7]
> есть большая разница передавать переменные в процедуру по
> значению или по ссылке (c VAR)
>
> если по значению надо писать в обявлении by value

Немного не понимаю.
Возможно вы имеете ввиду - возвращать переменные? Потому что, согласно структуре sql, объявляющего процедуру, ко входным параметрам by valueне применим.
И при чем тут наличие или отсутсвие Var?

ЗЫ: Буду признателен, если поясните свой пост.


DSKalugin   (2005-01-06 11:39:00) [2]

есть большая разница передавать переменные в процедуру по значению или по ссылке (c VAR)

если по значению надо писать в обявлении by value


|Denis|   (2005-01-05 21:34:00) [3]


> Desdechado ©   (05.01.05 21:04) [5]

Огромное спасибо.


Desdechado   (2005-01-05 21:04:00) [4]

declare external function my_procent
smallint, smallint
returns double precision by value
entry_point 'my_procent'
module_name 'my_lib1.dll';


|Denis|   (2005-01-05 20:24:00) [5]

Ни ужели никто никогда не писал пользовательских функций? Или вопрос настолько глуп, что не стоит на него отвечать?


|Denis|   (2005-01-05 14:30:00) [6]

Теперь при тех же данных выдает другие значения:
1.97626258336499У-323
4.94065645841247У-323

... не совсем то, что нужно (тип Double Precision, ибо просто Double вроде как не существует для IB).

В качестве эксперимента, попробовал изменить dll-ку следующим образом:

function my_procent(var seloe, chast: SmallInt): SmallInt; cdecl;
begin
result := chast + seloe;
end;

И соответственно:

declare external function my_procent
smallint, smallint
returns  smallint
entry_point 'my_procent'
module_name 'my_lib1.dll';


Теперь, при попытке выполнить запрос, происходит "...connection lost to database".

Возможно ошибка в самом принципе создания dll? Я выбираю dll wizard, пишу обозначенный код, компилю - вылазит сообщение:
"cannot debug project unless a host application is defined. Use Run|Parametrs... dialog box". dll-ка создавалась и меня это устраивало ))
Возможно что-то нужно указать в Run|Parametrs? Что?


Digitman   (2005-01-05 13:10:00) [7]

library my_lib1;
uses
SysUtils,
Classes;
{$R *.res}

function my_procent( varseloe, chast: SmallInt): Double; cdecl;
begin
result := chast*100/seloe;
end;

exports
my_procent;

begin
end.

declare external function my_procent
smallint, smallint
returns double
entry_point 'my_procent'
module_name 'my_lib1.dll';

select my_procent (field1, field2) from table1


|Denis|   (2005-01-05 12:58:00) [8]

Как вариант, не могли бы вы педоставить какую-нить свою UDF? Чтобы я попробовал разобраться сам.


Наверх

Титульная страница Поиск, карта сайта Написать письмо