Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];

Вниз

Проблемы UDF   Найти похожие ветки 

 
Bizon's ©   (2004-07-13 23:51) [0]

Имеется функция:
function UpCase(InString: PChar): PChar; cdecl; export;
begin
 try
   Result:=StrNew(AnsiStrUpper(InString));
 except
   Result:=StrNew("");
 end;
end;

и скрипт DECLARE EXTERNAL FUNCTION UPCASE
CSTRING (512)
RETURNS CSTRING (512) FREE_IT
ENTRY_POINT "UpCase" MODULE_NAME "FUNC_UDF";


Когда в таблице много записей, то программа розрывает соединение и вылетает. Когда мало записей, то программа как будто работает.
В чем моя ошибка? И как его переделать?


 
Digitman ©   (2004-07-14 08:37) [1]

function UpCase(InString: PChar): PChar; cdecl;
var
 tempstr: String;
begin
 try
  tempstr := AnsiStrUpper(String(InString));  
  Result := StrCopy(InString, PChar(tempstr));  
 except
   Result := nil;
 end;
end;

DECLARE EXTERNAL FUNCTION UPCASE
CSTRING (512)
RETURNS CSTRING (512)
ENTRY_POINT "UpCase" MODULE_NAME "FUNC_UDF";


 
Digitman ©   (2004-07-14 08:40) [2]

p.s.

не забудь
IsMultiThread := True;
в теле begin..end в dpr библиотеки


 
Bizon's ©   (2004-07-14 18:40) [3]

С этим я согласен, когда мы передаем PChar, то его по ссылке можна вернуть в Result:

> tempstr := AnsiStrUpper(String(InString));  
> Result := StrCopy(InString, PChar(tempstr));  

Но когда параметров нет и нужно вернуть PChar, то для этого нужно выделить память(как я думаю). Как быть тогда? Как очистить память?


 
Digitman ©   (2004-07-14 18:48) [4]


> когда параметров нет и нужно вернуть PChar, то для этого
> нужно выделить память(как я думаю). Как быть тогда? Как
> очистить память?


параметра быть не может - null-строка, переданная сервером в UDF в виде cstring() (подчеркиваю - речь сейчас идет конкретно о cstring и ни о каком ином типе !), выглядит в теле UDF как строка нулевой длины, т.е. строка состоящая из единственного символа-терминатора.. иными словами, входной факт. параметр InString у тебя никогда не будет равен nil, что бы сервер ни передавал тебе ..

вот ее же и верни, если Result := nil не устраивает (возврат nil в дан.случае будет для сервера эквивалентен возврату null-строки)

и выделять/освобождать в этом случае ничего не надо - сервер сам об этом позаботится


 
Digitman ©   (2004-07-14 18:49) [5]


> параметра быть не может


очепятка .. читать как :

"параметра не быть не может"


 
Digitman ©   (2004-07-14 18:59) [6]


> Bizon"s ©   (14.07.04 18:40) [3]


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

но только не так, как ты умудрился это проделать ...
в соответствии с соглашениями об использовании сервером и UDF единого менеджера памяти последнюю следует запрашивать с помощью ф-ции ib_util_malloc() из штатно поставляемой UDF-библиотеки ib_utils.dll, когда речь идет об FB1.5/YA последних версий .. для FB1 и IB6.x (и младших их версий) аналогичная ф-ция - malloc() из состава msvcrt.dll, так же как правило штатно поставляемой в дистрибутиве сервера



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

Форум: "Базы";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.039 c
3-1089796456
Темно-серый
2004-07-14 13:14
2004.08.08
Проблема с украинским языком


14-1090428956
Krug
2004-07-21 20:55
2004.08.08
Объясните новичку


14-1090392311
Slider007
2004-07-21 10:45
2004.08.08
Kaspersky Antivirus 5.0.142 обновление баз


14-1090659941
tkv
2004-07-24 13:05
2004.08.08
Проверьте плз мои расчеты!


8-1085220107
kopcap
2004-05-22 14:01
2004.08.08
Как натянуть текстуру на обьект.....





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский