Странный глюк UDF

bilov
Дата: 18.06.2009 23:18:16
Я сделал простенькую UDF на Delphi 6 для Firebird
function RepAll(initStr:PChar;Old_str:PChar;New_str:PChar):PChar;cdecl;
begin
Result:=PChar(
StringReplace(
String(initStr) ,
String(Old_str),
String(New_str) ,
[rfReplaceAll, rfIgnoreCase]
)
);

end;

обявил её
DECLARE EXTERNAL FUNCTION REPALL
CSTRING(256),
CSTRING(256),
CSTRING(256)
RETURNS CSTRING(256)
ENTRY_POINT 'RepAll' MODULE_NAME 'UDF0.dll';

Она вроде бы заработала , но случайно я обнаружил глюк
Repall('--q----q1234','q','....')=--....----....12
а не --....----....1234
и так с некоторыми подобными строками, с остальными все нормально.

Вроде бы StringReplace всегда работает хорошо и с этой строкой тоже.
В чем я ошибся и можно ли сделать чтобы моя UDF работала надежно? Если нет то где можно раздобыть её стандартный аналог
Гаджимурадов Рустам
Дата: 18.06.2009 23:25:15

bilov> Она вроде бы заработала , но случайно я обнаружил глюк
> Repall('--q----q1234','q','....')=--....----....12
> а не --....----....1234

В смысле, строка обрезалась? Или что?

bilov> Если нет то где можно раздобыть её стандартный аналог

Начиная с версии 2.1 есть встроенная Replace.

Posted via ActualForum NNTP Server 1.4

bilov
Дата: 18.06.2009 23:38:42
Гаджимурадов Рустам,
Да обрезалась
bilov
Дата: 18.06.2009 23:47:47
Встроенная replace без глюков , она у меня в ibexper не отображалась тк база была зарегестрированна не правильно (как firebird 2.0 , хотя работает на firebird 2.1)
Dimitry Sibiryakov
Дата: 18.06.2009 23:53:26

bilov
Я сделал простенькую UDF на Delphi 6 для Firebird

Ты сделал отличный пример как НЕ НАДО писать UDF. Поздравляю.

Posted via ActualForum NNTP Server 1.4

kdv
Дата: 19.06.2009 00:12:24
почему люди так не любят на примерах учиться? Открыл бы www.ibase.ru, там дофига udf с исходниками, правильных, и статья о том, как надо писать udf.
Нет же, напишут такую фигню, а потом удивляются - почему глючит? :-)

твоя udf и не должна ничего нормально возвращать. потому что возврат параметра (как и передача, впрочем) написана неправильно.