Страница 1 из 2
Первый раз UDF
Добавлено: 05 фев 2007, 17:34
Leons
Выручайте...
Код: Выделить всё
library my_udf;
uses
SysUtils,
Classes;
var
ResultInteger: Integer;
function AnalysisStr(var Str:String; var ItemIndex:SmallInt; var ItemCount:SmallInt):PInteger; cdecl; export;
var
S: TStringList;
begin
S:= TStringList.Create;
S.DelimitedText := Str;
S.Delimiter := ',';
ItemCount := S.Count;
if ItemCount >= ItemIndex Then ResultInteger := StrToInt(S.Strings[ ItemIndex ])
else ResultInteger := -10;
S.Free;
Result := @ResultInteger;
end;
exports
AnalysisStr;
begin
end.
Код: Выделить всё
DECLARE EXTERNAL FUNCTION NEW_UDF
VARCHAR(250),
SMALLINT,
SMALLINT
RETURNS SMALLINT FREE_IT
ENTRY_POINT 'AnalysisStr' MODULE_NAME 'my_udf'
При вызове разрывается соединение с сервером
Добавлено: 05 фев 2007, 18:03
WildSery
Читал? Перечитай ещё раз.
Добавлено: 05 фев 2007, 18:32
kdv
интересно, почему так трудно учиться на примерах?
Где в примерах, статьях или документации сказано, что в udf можно передавать string? И зачем передавать integer по указателю ???
Добавлено: 05 фев 2007, 18:59
WildSery
Кстати, использовать глобальную переменную в UDF - это не просто плохо, а очень плохо.
Добавлено: 05 фев 2007, 19:16
kdv
и писать бред вроде returns smallint free_it - тоже. Одновременно передавая на выход PInteger.
в общем, если бы автор еще и stdcall функцию сделал, то был бы абсолютно полный комплект ошибок из разряда "как не надо писать udf".
Добавлено: 06 фев 2007, 09:54
Leons
Сори) Но про глобальную переменную вычитал в статье именно на этом сайте) Написано, что глобальная переменная сбрасывает значение в самый последний момент, в отличии от локальной. При использовании локальной переменной в некоторых случаях возвращается пустое значение.
Добавлено: 06 фев 2007, 10:02
kdv
написано, что глобальная переменная сбрасывает значение в самый последний момент, в отличии от локальной. При использовании локальной переменной в некоторых случаях возвращается пустое значение.
не в карты, а в шахматы, и не выиграл, а проиграл.
скорее всего там написано вообще не то. как минимум, там должно быть написано, что глобальными переменными в udf можно пользоваться только в архитектуре Classic.
Пожалуйста, или не читай по диагонали, или дай точную цитату, чтобы я посмотрел и проверил.
Ну а насчет остальных ошибок что?

Добавлено: 06 фев 2007, 10:10
Leons
Код: Выделить всё
library my_udf;
uses
SysUtils,
Classes;
function AnalysisStr(var Str:PChar; var ItemIndex:SmallInt; var ItemCount:SmallInt):Integer; cdecl; export;
var
S: TStringList;
begin
S:= TStringList.Create;
S.DelimitedText := Str;
S.Delimiter := ',';
ItemCount := S.Count;
if ItemCount >= ItemIndex Then Result := StrToInt(S.Strings[ ItemIndex ])
else Result := -10;
S.Free;
end;
exports
AnalysisStr;
begin
end.
Код: Выделить всё
DECLARE EXTERNAL FUNCTION MY_UDF
VARCHAR(250),
SMALLINT,
SMALLINT
RETURNS INTEGER BY VALUE
ENTRY_POINT 'AnalysisStr' MODULE_NAME 'my_udf'
Не работает)
UDF - Зло;)
Мне подсказали иной выход из ситуации)
http://forum.ibase.ru/phpBB2/viewtopic.php?t=3359
Добавлено: 06 фев 2007, 10:25
Dimitry Sibiryakov
Leons писал(а):
UDF - Зло;)
Думать меньше надо, больше читать документацию. Ну вот с какой балды ты решил что PChar и VarChar совместимы???
Добавлено: 06 фев 2007, 10:36
kdv
Мне подсказали иной выход из ситуации
понятно что подсказали. но ты как писал UDF "с ашипками", так и продолжаешь. Причем с ошибками по причине элементарной НЕВНИМАТЕЛЬНОСТИ.
Добавлено: 06 фев 2007, 10:39
Leons
Dimitry Sibiryakov писал(а):Leons писал(а):
UDF - Зло;)
Думать меньше надо, больше читать документацию. Ну вот с какой балды ты решил что PChar и VarChar совместимы???
В вышеприведенных примерах мы использовали переменные типа integer, smallint – эти типы полностью совпадают в IB и Delphi.
А вот таблица соответствия остальных типов данных:
type
C, C++, Delphi InterBase
------------- ------------- ----------------
Short SmallInt SmallInt
Long Longint Integer
int Integer Integer
Float Single Float
Double Double Double precision
*void, *char PChar Char(???), VarChar(???), CString
http://www.ibase.ru/devinfo/udf_ok.htm
Добавлено: 06 фев 2007, 10:40
Leons
покажите плизз, где ошибка...
Добавлено: 06 фев 2007, 10:58
kdv
блин. при чем тут какое-то соответствие типов?
читай про передачу строк.
CString – это строка символов оканчивающаяся нулевым символом, т.е. типичная строка языка С (или Delphi PChar), что и видно из названия.
VarChar – это очень похоже на строку языка Pascal (или Delphi ShortString),
но имеет в начале не один, а два байта, представляющие длину строки.
Похоже, но в C/Pascal НЕТ эквивалента varchar и char, которые в IB/FB.
И в статье видно - как задекларирован параметр, и как он передается и обрабатывается в функции.
собственно, поэтому есть правило - всегда использовать для объявления udf CSTRING, и не парить мозг в функции, т.к. это будет обычный pchar что бы ты в функцию в SQL не передал. В статье об этом тоже написано.
p.s. статью подправлю, хоть и не моя. Но ты все равно один из первых, кто не так прочитал именно этот момент. Посмотрел бы мой пример,
www.ibase.ru/devinfo/safeudf.zip или другие, и увидел бы, что с параметрами varchar и char функции никто не объявляет.
Добавлено: 06 фев 2007, 10:59
Dimitry Sibiryakov
Leons писал(а):покажите плизз, где ошибка...
Знаешь, наверное проще будет сказать в какой строке ошибок нет...
Вот она, эта единственная строка:
Добавлено: 06 фев 2007, 11:29
Leons
нет такого файла.
www.ibase.ru/devinfo/safeudf.zip
Лана, замучал я Вас, буду позже сам осваивать UDF. Пока что без него обойдусь.
Dimitry Sibiryakov - злой ты
Добавлено: 06 фев 2007, 11:50
CyberMax
1.
Код: Выделить всё
S:= TStringList.Create;
try
...
finally
S.Free;
end;
2. Зачем передавать в функцию ItemCount, если ей потом присваивается значение?
Добавлено: 06 фев 2007, 11:57
Leons
1. Ты прав. В конечной "рабочей" версии так и будет
2. Она только для возврата значения.
Добавлено: 06 фев 2007, 11:59
kdv
нет такого файла.
www.ibase.ru/download/safeudf.zip
на сайте есть поиск. мог бы и сам по слову safeudf найти.
Добавлено: 06 фев 2007, 12:25
WildSery
Leons писал(а):2. Она только для возврата значения.
Для возврата куда?
У тебя Result возвращается, зачем тебе ещё одна переменная входная?
Добавлено: 06 фев 2007, 13:00
Leons
WildSery писал(а):Leons писал(а):2. Она только для возврата значения.
Для возврата куда?
У тебя Result возвращается, зачем тебе ещё одна переменная входная?
Это еще одно возвращаемое значение для ХП, через которое планировалось определять количество элементов в :code, для обращения к ним без выхода за проделы.
Ребят, предлагаю закрыть тему. Эта процедурка писалась 10- секунд для теста UDF. Я обошелся без UDF. Так что почитаю повнимательнее про все это попозже.
Если кому не сложно, переделайте данный пример в рабочую версию. Я посмторю отличия)