Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.29;
Скачать: CL | DM;

Вниз

Отладка UDF Firebird   Найти похожие ветки 

 
AlexPul   (2003-09-09 17:59) [0]

пытаюсь отладить UDF
Посоветовали указать в качестве Run \ Parameters \ Host Application ibserver.exe
Так я и делаю. Только через несколько секунд работа приложения завершается.


 
Verg ©   (2003-09-09 18:19) [1]


> Посоветовали указать в качестве Run \ Parameters \ Host
> Application ibserver.exe


Да, но только он (ibserver) должен запускаться не сервисом, а обычным консольным приложением (как под 9х).


 
AlexPul   (2003-09-09 18:34) [2]

Я написал библиотеку с функцией
Function ANKLIKE(s1, s2: PChar; Porog: Longint): Longint; cdecl; export;
Как мне ее правильно декларировать в БД.
Я делаю так:
DECLARE EXTERNAL FUNCTION ANKLIKE
VARCHAR (100),
VARCHAR (100),
INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT "ANKLIKE" MODULE_NAME "ankudf";
Все OK
Однако попытка выполнить запрос
select COUNT(*) from "Table1" where
ANKLIKE("Table1"."aaaaaaa", "123", 8)=1
приводит к тому, что я в функцию получаю мусор.
Подскажите, что я не так делаю


 
kaif ©   (2003-09-09 19:15) [3]

Вроде все верно.
А ты пробовал эту функцию отладить просто импортировав ее в обычное приложение? Так проще будет. Может функция неправильно работает.


 
Reindeer Moss Eater ©   (2003-09-09 19:21) [4]

приводит к тому, что я в функцию получаю мусор.
Как это было установлено?
Как читаются переданные параметры в udf?


 
Digitman ©   (2003-09-10 08:20) [5]


> AlexPul


Function ANKLIKE(s1, s2: PChar; var Porog: Longint): Longint; cdecl; export;

DECLARE EXTERNAL FUNCTION ANKLIKE
cstring(100),
cstring(100),
INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT "ANKLIKE" MODULE_NAME "ankudf";


 
Val ©   (2003-09-10 10:07) [6]

>Digitman © (10.09.03 08:20) [5]
var Porog: Longint
почему по ссылке?


 
Digitman ©   (2003-09-10 10:19) [7]


> Val


> почему по ссылке?


потому что IB-сервер (и его клоны) всегда передает фактические параметры в UDF не по их значениям, а по ссылкам на временно создаваемые их копии


 
Val ©   (2003-09-10 10:22) [8]

Digitman © (10.09.03 10:19) [7]
спасибо


 
Digitman ©   (2003-09-10 10:50) [9]


> Val


крайне важно понимать, что каждый передаваемый в UDF факт.параметр является временной копией, а не оригиналом.

уничтожение врем.копии происходит автоматически ПОСЛЕ получения сервером результата вызова UDF.

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

DECLARE EXTERNAL FUNCTION SUMMMA
INTEGER BY REFERENCE,
INTEGER BY REFERENCE,
RETURNS INTEGER
ENTRY_POINT "SUMMMA" MODULE_NAME "myudf.dll";

Function SUMMA(var Value1, Value2: Integer): PInteger; cdecl; export;
begin
// поскольку тип результата совпадает с типом одного из форм.параметров, смело возвращаем ссылку на область памяти, временно выделенную сервером для передачи, например, 1-го параметра

Result := @Value1;

// и записываем в эту область памяти результат ф-ции - сумму двух факт. Integer-параметров
// ибо серверу безразличен факт изменения содержимого области памяти, выделенной им перед вызовом UDF, под любой из факт.параметров
// результат он возьмет по той ссылке, которую мы вернули ему
// поскольку ссылка достоверна вплоть до чтения сервером результата по ней, никаких проблем не будет : прочитав результат, сервер только после этого автомат-ки уничтожит копию.параметра, на область памяти которого мы здесь сослались
Result^ := Value1 + Value2;
end;


 
Val ©   (2003-09-10 12:36) [10]

>Digitman © (10.09.03 10:50) [9]
здOрово, еще раз спасибо.



Страницы: 1 вся ветка

Текущий архив: 2003.09.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.027 c
14-96392
Vladimir
2003-09-11 17:04
2003.09.29
Поиск записи по вложениям! HELP


7-96453
zeppelin
2003-07-18 16:11
2003.09.29
Переменные окружения


14-96359
Е-Моё имя
2003-09-12 10:00
2003.09.29
Интернет


4-96489
SergeySEM
2003-07-25 12:41
2003.09.29
Событие по созданию окна,процесса


1-96191
Kremen
2003-09-16 10:18
2003.09.29
Как програмно узнать разрешение экрана?