![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
UDF [D7, XP]
Irish_34 © (2007-12-10 20:02:00)Привет ВСЕМ, помогите пожалусто UDF, начиная работать в процедуре "спотыкается" об чего, я уже не знаю в чем и ошибка и чге я некоректно что обозвала
DECLARE EXTERNAL FUNCTION CEX6
VARCHAR(50)
RETURNS VARCHAR(50) BY DESCRIPTOR
ENTRY_POINT 'psc6' MODULE_NAME 'PDL6.dll'
function psc6(var s:PChar):PChar;cdecl;export;
var
j1,i1:byte;
j: PSmallInt;
s1: string;
begin
j:=nil;
j1:=0;
i1:=0;
if ((s=nil) or (s='0') or (s='')) then
Result:='0'
else
if StrPos(s,'6')<>nil then
begin
j:=PSmallInt(StrPos(s,'6'));
s1:=PChar(s)^;
Result:='';
delete(s1,1,j^+1);
if Length(s1)=1 then //s:=copy(s1,1,1)
StrPLcopy(Result,s1,1)
else
begin
for i1:=1 to length(s1) do
if ((s1[i1]=',') or (s1[i1]='.') or (s1[i1]=';') or (s1[i1]=' '))
then
begin
delete(s1,i1,length(s1));
StrPLcopy(Result,s1,length(s1));
end
else StrPLcopy(Result,s1,2);
end;
end
else
Result:='';
end;
irish_34 (2007-12-12 12:10:00) [81]
> Desdechado ©
Unsuccessful execution caused by a system error that precludes
Successful execution of subsequent statements.
Unable to complete network request to host “”.
Error reading data from the connection.
Desdechado (2007-12-12 08:47:00) [82]> системная ошибка из-за выражения которое не может успешно
> выполниться
Да ну? А я думал, FB по-русски не ругается.
Сергей М. (2007-12-12 08:40:00) [83]Т.е. результирующая строка не может быть длиннее исходной ?
Тогда можно поступить проще:
DECLARE EXTERNAL FUNCTION CEX6
VARCHAR(50)
RETURNS PARAMETER 1
ENTRY_POINT 'psc6' MODULE_NAME 'PDL6.dll'
function psc6(AString:PChar):PChar; cdecl;
var
tmpstr: String;
..
begin
tmpstr := AString;
... работа с локальной копией (tmpstr) исходной строки в соответствии с [17]
.. результат обработки подразумевается находящимся там же, т.е. в tmpstr
Result := lstrcpy(AString, PChar(tmpstr)); //возврат результата
end;
irish_34 (2007-12-11 18:31:00) [84]
> Сергей М.
выделить часть строки после '6' без разделителей
Сергей М. (2007-12-11 08:11:00) [85]
> Irish_34
Что должна делать эта функция ?
irish_34 (2007-12-10 23:10:00) [86]системная ошибка из-за выражения которое не может успешно выполниться
написано что так следует передавать параметр в UDF
Desdechado (2007-12-10 23:03:00) [87]> ( vars:PChar)
Зачем это?
Desdechado (2007-12-10 23:00:00) [88]1.что_дальше?
Текст ошибки где?
Терпение не резиновое...
trubin (2007-12-10 22:59:00) [89]Пишешь "by descriptor", только не видно, где ты у себя в функции используешь структуру дескриптора параметра. А на null можно и проверку в ХП делать.
irish_34 (2007-12-10 22:54:00) [90]FB1
Desdechado (2007-12-10 22:50:00) [91]Кроме того, не все модификаторы доступны в разных версиях IB|FB. А ты даже сам сервер не указало, так что о чем речь?
Desdechado (2007-12-10 22:49:00) [92]> но судя по попытке запроса выполниться ошибка не в регистрации UDF
Увы, я, не видя ошибки, ничего посоветовать не могу.
irish_34 (2007-12-10 22:34:00) [93]но судя по попытке запроса выполниться ошибка не в регистрации UDF
irish_34 (2007-12-10 22:26:00) [94]ну значит и не надо вовлекать сюда FREE_IT, BY DESCRIPTOR по написанному (в тоё же статье) с null позволяет работать, хотя в этой суюд и без него нормально всё работало
Desdechado (2007-12-10 22:14:00) [95]Нужно не лепить их бездумно, а понимать, для чего они. FREE_IT, наприер, нужно для того, чтобы сервер освободил выделенную в UDF (и вовзернутую ему) память после того, как она стала не нужна.
irish_34 (2007-12-10 21:18:00) [96]а про BY DESCRIPTOR как раз в статье прочла
irish_34 (2007-12-10 21:17:00) [97]Спасибо большое :*
а без "FREE_IT" разве ни как нельзя....
trubin (2007-12-10 20:56:00) [98]1)
> RETURNS VARCHAR(50) BY DESCRIPTOR
зачем "by descriptor", надо "FREE_IT"
2)
Память под Result не выделяется
3)
> s1:=PChar(s)^;
s1:= string(s);
irish_34 (2007-12-10 20:17:00) [99]Перечитала....
Johnmen (2007-12-10 20:11:00) [100]http://www.ibase.ru/devinfo/udf_ok.htm