Текущий архив: 2008.01.27;
Скачать: CL | DM;
Вниз
UDF Найти похожие ветки
← →
Irish_34 (2007-12-10 20:02) [0]Привет ВСЕМ, помогите пожалусто 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;
← →
Johnmen © (2007-12-10 20:11) [1]http://www.ibase.ru/devinfo/udf_ok.htm
← →
irish_34 (2007-12-10 20:17) [2]Перечитала....
← →
trubin © (2007-12-10 20:56) [3]1)
> RETURNS VARCHAR(50) BY DESCRIPTOR
зачем "by descriptor", надо "FREE_IT"
2)
Память под Result не выделяется
3)
> s1:=PChar(s)^;
s1:= string(s);
← →
irish_34 (2007-12-10 21:17) [4]Спасибо большое :*
а без "FREE_IT" разве ни как нельзя....
← →
irish_34 (2007-12-10 21:18) [5]а про BY DESCRIPTOR как раз в статье прочла
← →
Desdechado © (2007-12-10 22:14) [6]Нужно не лепить их бездумно, а понимать, для чего они. FREE_IT, наприер, нужно для того, чтобы сервер освободил выделенную в UDF (и вовзернутую ему) память после того, как она стала не нужна.
← →
irish_34 (2007-12-10 22:26) [7]ну значит и не надо вовлекать сюда FREE_IT, BY DESCRIPTOR по написанному (в тоё же статье) с null позволяет работать, хотя в этой суюд и без него нормально всё работало
← →
irish_34 (2007-12-10 22:34) [8]но судя по попытке запроса выполниться ошибка не в регистрации UDF
← →
Desdechado © (2007-12-10 22:49) [9]> но судя по попытке запроса выполниться ошибка не в регистрации UDF
Увы, я, не видя ошибки, ничего посоветовать не могу.
← →
Desdechado © (2007-12-10 22:50) [10]Кроме того, не все модификаторы доступны в разных версиях IB|FB. А ты даже сам сервер не указало, так что о чем речь?
← →
irish_34 (2007-12-10 22:54) [11]FB1
← →
trubin © (2007-12-10 22:59) [12]Пишешь "by descriptor", только не видно, где ты у себя в функции используешь структуру дескриптора параметра. А на null можно и проверку в ХП делать.
← →
Desdechado © (2007-12-10 23:00) [13]1.что_дальше?
Текст ошибки где?
Терпение не резиновое...
← →
Desdechado © (2007-12-10 23:03) [14]> (var s:PChar)
Зачем это?
← →
irish_34 (2007-12-10 23:10) [15]системная ошибка из-за выражения которое не может успешно выполниться
написано что так следует передавать параметр в UDF
← →
Сергей М. © (2007-12-11 08:11) [16]
> Irish_34
Что должна делать эта функция ?
← →
irish_34 (2007-12-11 18:31) [17]
> Сергей М.
выделить часть строки после "6" без разделителей
← →
Сергей М. © (2007-12-12 08:40) [18]Т.е. результирующая строка не может быть длиннее исходной ?
Тогда можно поступить проще: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;
← →
Desdechado © (2007-12-12 08:47) [19]> системная ошибка из-за выражения которое не может успешно
> выполниться
Да ну? А я думал, FB по-русски не ругается.
← →
irish_34 (2007-12-12 12:10) [20]
> 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 12:22) [21]А, так это ты сервер "уронила". Проблема с манипуляцией паматью.
Вот пример корректной UDF:{ DECLARE EXTERNAL FUNCTION SubStr
CSTRING( 32765 ), INTEGER, INTEGER
RETURNS CSTRING( 32765 ) FREE_IT
ENTRY_POINT "fn_SubStr" MODULE_NAME "ib_fv";
}
{----- получение подстроки с символа nFrom, всего nCount штук -----}
function fn_SubStr( lpInp: PChar; var nFrom, nCount: Integer ): PChar; cdecl; export;
var
lpStr: PChar;
nLen, nStart, i: Integer;
begin
{--- выделение памяти под ответ ---}
nLen := StrLen( lpInp );
if( nFrom <= 1 ) then
nStart := 0 {--- nFrom - по основанию 1 ---}
else if( nFrom > nLen ) then
nStart := nLen
else
nStart := nFrom - 1; {--- nStart - по основанию 0 ---}
if( nStart + nCount < nLen ) then
nLen := nStart + nCount;
lpStr := Malloc( nLen - nStart + 1 );
{--- заполнение символами ---}
i := nStart;
while( i < nLen ) do
begin
lpStr[ i - nStart ] := lpInp[ i ];
Inc( i );
end;
lpStr[ i - nStart ] := #0;
result := lpStr;
end;
← →
Сергей М. © (2007-12-12 12:26) [22]
> Desdechado © (12.12.07 12:22) [21]
А есть ли в этом случае резон для malloc() ?
Или это ты просто в кач-ве отвлеченного примера, иллюстрирующего использование FREE_IT ?
← →
Desdechado © (2007-12-12 13:07) [23]> А есть ли в этом случае резон для malloc() ?
Зависит от того, хочешь ли ты сохранить у сервера исходное передаваемое значение, м.б. важно в ХП.
← →
Сергей М. © (2007-12-12 13:15) [24]
> исходное передаваемое значение
Параметром в UDF в любом случае передается копия неких данных, а не сами данные.
← →
Desdechado © (2007-12-12 15:20) [25]Верно, подзабыл уже, давно не писал UDF.
← →
Сергей М. © (2007-12-12 15:51) [26]
> irish_34 (10.12.07 21:18) [5]
> про BY DESCRIPTOR как раз в статье прочла
То ли ты ее не дочитала, то ли статья, мягко говоря, неважнецкая, но спецификатор BY DESCRIPTOR, если угодно, есть некое подобие спецификатора, указывающего на вариантный тип данных.
Если тип передаваемых/возвращаемых данных заранее известен, то использование этого спецификатора ничем не оправдано и лишь усложняет как код на стороне сервера, так и на стороне UDF
← →
trubin © (2007-12-12 17:08) [27]
> lpStr := Malloc( nLen - nStart + 1 );
Правильнее использовать ib_util_malloc из ib_util.dll
← →
Desdechado © (2007-12-12 20:56) [28]> trubin © (12.12.07 17:08) [27]
Считай, что спереди стоитfunction Malloc( nSize: LongInt ): PChar; cdecl; external "ib_util.dll" name "ib_util_malloc";
А вообще для FB1.x фиолетово.
;D
← →
irish_34 (2007-12-13 18:25) [29]Вроде работает, но после отключения от базы выдает ошибку "инстукция по адресу 0Х00000000 обратилась к памяти по адресу 0Х00000000
← →
Сергей М. © (2007-12-14 11:16) [30]
> irish_34 (13.12.07 18:25) [29]
ПРиводи полный текст своей udf dll
← →
Правильный_Вася (2007-12-14 11:40) [31]> после отключения от базы выдает ошибку
Кто выдает ошибку - клиентская программа или сервер?
Если клиентская программа, то дело не в UDF.
← →
irish_34 (2007-12-14 18:47) [32]
> Кто выдает ошибку - клиентская программа или сервер?
> Если клиентская программа, то дело не в UDF
UDF я отлаживаю не в клиенте конечно же
← →
trubin © (2007-12-14 19:41) [33]
> ПРиводи полный текст своей udf dll
+1
← →
Desdechado © (2007-12-14 20:52) [34]> UDF я отлаживаю не в клиенте конечно же
Хм, а как ее можно отладить еще?
Ты ж я вно какой-то запрос должна делать, чтоб использовать UDF, а запрос сервер сам себе сгенерировать не может.
← →
irish_34 (2007-12-15 11:16) [35]
> Хм, а как ее можно отладить еще?
> Ты ж я вно какой-то запрос должна делать, чтоб использовать
> UDF, а запрос сервер сам себе сгенерировать не может.
я имела ввиду не в приложени, а в утилите(IBExpert) запрос пишу. А отладить как написано в статье нет.
← →
irish_34 (2007-12-15 11:16) [36]
> ПРиводи полный текст своей udf dll
{.$Define Debug}
{$ALIGN OFF}
unit UDFL6;
interface
uses ShareMem, SysUtils;
implementation
function malloc(Size:integer):PChar;cdecl;external "msvcrt.dll";
function psc6(s:PChar):PChar;cdecl;export;
var
i1,j,j1:byte;
s1: string;
begin
j1:=0;
result:=malloc(6);
if (s=nil) then s1:="0"
else
begin
s1:=string(s);
if Pos("6",s1)>0 then
begin
delete(s1,1,Pos("6",s1));
if Pos(",",s1)>0 then j1:=Pos(",",s1) else
if Pos(".",s1)>0 then j1:=Pos(".",s1) else
if Pos(";",s1)>0 then j1:=Pos(";",s1) else
if Pos(" ",s1)>0 then j1:=Pos(" ",s1) else
if Pos(")",s1)>0 then j1:=Pos(")",s1);
if j1>0 then delete(s1,1,j1) else s1:="0";
if length(s1)=0 then s1:="0" else
begin
j:=0;
if Pos(",",s1)>0 then delete(s1,Pos(",",s1),length(s1));
if Pos(".",s1)>0 then delete(s1,Pos(".",s1),length(s1));
if Pos(";",s1)>0 then delete(s1,Pos(";",s1),length(s1));
if Pos(" ",s1)>0 then delete(s1,Pos(" ",s1),length(s1));
end;
end
else s1:="0";
end;
StrPcopy(result,s1);
result[6]:=#0;
end;
exports
psc6;
end.
← →
irish_34 (2007-12-15 11:18) [37]кстати заработала она не от "result:=malloc(6); result[6]:=#0;", а от того что я удалила цикл и удалила перебор символов строки (s[i])
← →
Сергей М. © (2007-12-15 12:45) [38]
> uses ShareMem
Это еще зачем ?
← →
irish_34 (2007-12-15 13:22) [39]
> Это еще зачем ?
для работы со строками, но на работу никак не влияет
← →
Сергей М. © (2007-12-15 13:32) [40]
> для работы со строками
Это из другой оперы.
Убирай.
> на работу никак не влияет
>
Влияет. Не лучшим образом. Просто ты этого не ощущаешь.
← →
palva © (2007-12-15 13:49) [41]irish_34 (15.12.07 11:16) [36]
Я все-таки не понял. Вы пишете модуль, а потом каким-то образом используете его в качестве dll ?
← →
irish_34 (2007-12-15 14:00) [42]
> Я все-таки не понял. Вы пишете модуль, а потом каким-то
> образом используете его в качестве dll
library PDL6;
uses
UDFL6 in "UDFL6.pas";
end.
← →
irish_34 (2007-12-15 14:01) [43]
> Влияет. Не лучшим образом. Просто ты этого не ощущаешь.
но проблему о пяти с инструкцией это не решит
← →
Сергей М. © (2007-12-15 14:49) [44]
> проблему о пяти с инструкцией
П-п-переведи) ...
← →
irish_34 (2007-12-15 15:45) [45]
> П-п-переведи) ...
))))) ой....
ошибка "инстукция по адресу 0Х00000000 обратилась к памяти по адресу 0Х00000000" нет от подключения этого модуля
← →
trubin © (2007-12-15 16:06) [46]
> result:=malloc(6);
Это по условию задачи выходная строка не может быть больше 5-ти символов?
← →
irish_34 (2007-12-15 16:10) [47]
> Это по условию задачи выходная строка не может быть больше
> 5-ти символов?
да
← →
trubin © (2007-12-15 18:28) [48]Я так думаю тебе надо быстренько сварганить тестовый проектик, загрузить в нем свою dll-ку, и погонять свою функцию
← →
palva © (2007-12-15 18:40) [49]>> Это по условию задачи выходная строка не может быть больше 5-ти символов?
> да
А почему при описании UDF она такая большая:
CSTRING( 32765 ) ?
Вы не боитесь, что FireBird будет как либо использовать эту память перед тем как ее освободит? Например скопирует выходное значение в свою внутреннюю область памяти?
Кроме того, почему памяти выделяется 6 байтов, а нулевой бит записывается в 7-й:
result[6]:=#0;
Что произойдет, если входная строка окажется такой, что выходная строка переполнит выделенный буфер? Контроля ведь никакого не предусмотрено. Или входная строка окажется такой, что переполнятся байтовые переменные i1,j,j1
← →
Johnmen © (2007-12-16 00:35) [50]Ё-моё, сколько нафлудили!
А автору всего-то и надо, что внимательно прочитать статью...
← →
irish_34 (2007-12-16 13:14) [51]
> Ё-моё, сколько нафлудили!
> А автору всего-то и надо, что внимательно прочитать статью.
> ..
Вы имеете ввиду использование уникальной для каждой нити глобальной переменной при возврате результата по ссылке и фразу IsMultiThread:=true;?
а если с ней предполагается работа только одной нити?
← →
Desdechado © (2007-12-16 15:41) [52]> А почему при описании UDF она такая большая:CSTRING( 32765 ) ?
Это допустимый максимум, а не длина фактического значения.
> Кроме того, почему памяти выделяется 6 байтов, а нулевой
> бит записывается в 7-й:result[6]:=#0;
Действительно. Это и ставит сервер на колени.
← →
irish_34 (2007-12-16 15:55) [53]
> Действительно. Это и ставит сервер на колени.
ды его можно вообще не писать, по эксприменту, result[х]:=#0;
не повлияло на работу
← →
Desdechado © (2007-12-16 16:07) [54]> не повлияло на работу
Случайность. Стрка в Pchar обязана заканчиваться нулем.
И что за x?
← →
irish_34 (2007-12-16 16:17) [55]
> И что за x?
)))))))) эт не хэ это икс
фига се случайность, а чё тада на ошибку памяти 0*00000000 повлияло, завтра конечно посмотрю ещё свою "карявку", ну ни наю даже.......
← →
palva © (2007-12-16 16:18) [56]> Это допустимый максимум, а не длина фактического значения.
Ну то есть вы даете гарантию, что сервер не полезет читать возвращенный буфер дальше нулевого байта. Я, например, этого не знаю. Лезть в документацию и исходники мне влом. Соответственно, я задаю вопрос автору зачем он так сделал. Зачем автор сделал выравнивание текста не соответствующее логике программы? Неужели он думает, что отвечающий скопирует текст себе в редактор и будет его выравнивать? На самом деле большинство потенциальных отвечающих споткнулись об это выравнивание в первых постах и дальше читать не стали. Зачем автор демонстративно нарушает заповеди: если выделил 6 байтов, то седьмой даже читать нельзя.
> Действительно. Это и ставит сервер на колени.
Ну это вряд ли. Обычно память выделяется кусками, кратными восьми. А вот если обращение к UDF произойдет с подходящей длинной строкой, то тогда запросто.
← →
palva © (2007-12-16 16:36) [57]Автор, наверно вмешаюсь не в свое дело, но посоветую следующее.
1) не нужно выделять память в функции. Вы можете возвращать указатель на часть входного параметра, обрезав его если надо нулем. Это гораздо проще.
2) если уж вам пришлось работать с си-строками, то не преобразуйте их в паскалевские строки. В Delphi вполне достаточно функций для работы с си-строками. Постарайтесь вообще обойтись без строк и строковых функций делфи.
3) Для данной функции советую использовать сишную функцию strpbrk, которая экспортируется библиотекой msvcrt.dll Она ищет в строке (заданной первым параметром) один из символов, содержащийся в другой строке (второй параметр), и возвращает указатель на найденный символ либо NULL. Эта функция как будто специально написана для вас.
← →
irish_34 (2007-12-16 16:52) [58]
> Автор, наверно вмешаюсь не в свое дело, но посоветую следующее.
>
> 1) не нужно выделять память в функции. Вы можете возвращать
> указатель на часть входного параметра, обрезав его если
> надо нулем. Это гораздо проще.
почему не в свое, это же форум. я первый пунк я пробовала, вообще отключает сервер
← →
palva © (2007-12-16 17:08) [59]Ну значит ошибки нужно искать, доводить до ума.
Вот я написал пример. Только надо вставить проверки случаев, когда не найдено, здесь я вашу логику все равно в упор не понимаю.{$APPTYPE CONSOLE}
uses SysUtils;
function strpbrk(str, strCharSet: PChar): PChar; cdecl; external "msvcrt.dll";
function psc6(s: PChar): PChar; cdecl
const
set1: array [0..4] of char = ",.; "#0;
set2: array [0..5] of char = ",.; )"#0;
var
p: PChar;
begin
p := strpos(s, "6");
p := strpbrk(p, set1) + 1;
Result := p;
p := strpbrk(p, set2);
if p <> Nil then p^ := char(0);
end;
/////////// Testing /////////
var
s: String;
begin
s := "6___,rtytwey rzxt";
WriteLn(psc6(PChar(s))); // rtytwey
s := "6sdf,rty";
WriteLn(psc6(PChar(s))); // rty
end.
← →
Сергей М. © (2007-12-17 08:43) [60]
> irish_34 (16.12.07 13:14) [51]
> если с ней предполагается работа только одной нити?
Кем предполагается, тобой ?
Ты можешь предполагать что угодно, но сервер волен вызывать твою ф-цию в любой нити, в какой он сочтет необходимым.
← →
irish_34 (2007-12-17 21:34) [61]всё равно ни чё хорошо не работает, то ли это fb1 такой привередливый, то ли это ошибка ДНК
← →
Правильный_Вася (2007-12-17 22:46) [62]второе
← →
Сергей М. © (2007-12-18 08:32) [63]
> irish_34 (17.12.07 21:34) [61]
>
> всё равно ни чё хорошо не работает
Как это "не работает" ?
А это тогда как понимать
> irish_34 (15.12.07 11:18) [37]
>
> кстати заработала она
?
И почему не воспользовалась шаблоном в [18] ?
← →
irish_34 (2007-12-18 18:56) [64]
> второе
я так и знала, плюс логика женщины ну ни как не совместима с логикой программиста ))))
← →
irish_34 (2007-12-18 19:00) [65]
> А это тогда как понимать
это вплане того, что ошибка об инструкции всё равно остаётся (даже в [18]), а [18] я пользовалась, собственно с ним функцией обрабатывается вся таблица не "спотыкаясь" о сторки, но
← →
palva © (2007-12-18 22:02) [66]А бывает так, что на вход функции поступают значения NULL ?
← →
irish_34 (2007-12-18 22:24) [67]
> А бывает так, что на вход функции поступают значения NULL
> ?
нет, и условие есть+и проапдейтила специально, чтоб null не было
← →
Сергей М. © (2007-12-19 08:24) [68]
> irish_34 (18.12.07 19:00) [65]
> ошибка об инструкции всё равно остаётся (даже в [18])
Показывай свой код с шаблоном [18] ..
← →
irish_34 (2007-12-19 17:59) [69]
> Показывай свой код с шаблоном [18] ..
[36]
← →
www (2007-12-19 18:15) [70]
> irish_34 (19.12.07 17:59) [69]
тебе показали явные в нем проблемы
тебя решение интересует?
нет?
← →
irish_34 (2007-12-19 19:23) [71]
> тебя решение интересует
меня интересует причина такой ошибки памяти
← →
Сергей М. © (2007-12-20 08:25) [72]
> irish_34 (19.12.07 17:59) [69]
Код в [36] не соответствует шаблону из [18]
← →
irish_34 (2007-12-23 18:33) [73]
> [18]
дает такой же результат
← →
Сергей М. © (2007-12-24 11:53) [74]
> дает такой же результат
>
Показывай код ..
← →
irish_34 (2007-12-24 18:50) [75]
> Показывай код ..
{.$Define Debug}
{$ALIGN OFF}
unit U1;
interface
uses ShareMem, SysUtils;
implementation
function lstrcpy(Str1, Str2: PChar): PChar;cdecl;external "kernel32.dll";
function psc6(s:PChar):PChar;cdecl;export;
var
i1,j,j1:byte;
s1: string;
begin
j1:=0;
//if (s=nil) then s1:="0"
//else
begin
s1:=s;
if Pos("6",s1)>0 then
begin
delete(s1,1,Pos("6",s1));
if Pos(",",s1)>0 then j1:=Pos(",",s1) else
if Pos(".",s1)>0 then j1:=Pos(".",s1) else
if Pos(";",s1)>0 then j1:=Pos(";",s1) else
if Pos(" ",s1)>0 then j1:=Pos(" ",s1) else
if Pos(")",s1)>0 then j1:=Pos(")",s1);
if j1>0 then delete(s1,1,j1) else s1:="0";
if length(s1)=0 then s1:="0" else
begin
j:=0;
if Pos(",",s1)>0 then delete(s1,Pos(",",s1),length(s1));
if Pos(".",s1)>0 then delete(s1,Pos(".",s1),length(s1));
if Pos(";",s1)>0 then delete(s1,Pos(";",s1),length(s1));
if Pos(" ",s1)>0 then delete(s1,Pos(" ",s1),length(s1));
end;
end
else s1:="0";
end;
result:=lstrcpy(s,PChar(s1));
end;
exports
psc6;
end.
← →
trubin © (2007-12-24 19:18) [76]
> uses ShareMem, SysUtils;
Зачем это
> function lstrcpy(Str1, Str2: PChar): PChar;cdecl;external
> "kernel32.dll";
Вроде StdCall требуется, может ошибка при попытке очистки стека
← →
Desdechado © (2007-12-24 19:19) [77]
uses System;
илиfunction lstrcpy(lpString1, lpString2: PChar): PChar; stdcall;
external "kernel32.dll" name "lstrcpyA";
Учите матчасть.
← →
palva © (2007-12-24 20:46) [78]lstrcpy, lstrcpyA - это без разницы.
← →
irish_34 (2007-12-24 20:59) [79]
> > uses ShareMem, SysUtils;
>
>
> Зачем это
адо мне буду использовать менеджер памяти
← →
trubin © (2007-12-24 21:01) [80]
> адо мне буду использовать менеджер памяти
А смысл?
← →
palva © (2007-12-24 21:38) [81]Никак не могу приспособиться к вашей логике. Возьмем, например, такую строку:
"1234 5 6;xxx,yyy"
Ваша программа должна выделить из нее строку "yyy" Так?
← →
irish_34 (2007-12-24 22:03) [82]
> А смысл?
чтоб менше ошибок было как ещё в одном разговоре написано, используется один общий менеджер
← →
irish_34 (2007-12-24 22:04) [83]
> Ваша программа должна выделить из нее строку "yyy" Так?
ххх, но это не важно что происходит со строками, проблема я так поняла в некорректной работе с PChar
← →
palva © (2007-12-24 22:15) [84]> ххх
Тогда содержательно ваша программа работает неправильно. Возможно из-за ошибок, которых вы не ожидали, на ваших тестовых данных где-нибудь переполняется буфер.
> проблема я так поняла в некорректной работе с PChar
А для проверки работы с PChar можно временно выкинуть всю начинку и присвоить выходному параметру константное значение. По-крайней мере поймете, из-за чего программа валится.
Еще, Напишите здесь, как вы описали UDF в FireBird.
← →
irish_34 (2007-12-24 22:29) [85]
> Еще, Напишите здесь, как вы описали UDF в FireBird.
DECLARE EXTERNAL FUNCTION CEX6
CSTRING(50)
RETURNS CSTRING(50)
ENTRY_POINT "psc6" MODULE_NAME "Pr1.dll"
← →
palva © (2007-12-24 22:58) [86]trubin © (24.12.07 19:18) [76]
Вот это справедливо.
← →
Сергей М. © (2007-12-25 08:21) [87]
> irish_34 (24.12.07 22:03) [82]
> используется один общий менеджер
Общий с кем ?
> irish_34 (24.12.07 22:29) [85]
Отсебячина.
В [18] ф-ция декларирована иначе.
Что, проблема даже скопировать шаблон из [18] "один в один" ?)
← →
Desdechado © (2007-12-25 11:15) [88]> lstrcpy, lstrcpyA - это без разницы.
Разница выделена.
← →
Сергей М. © (2007-12-25 11:56) [89]
> irish_34 (24.12.07 22:04) [83]
>
>
Приведи десяток различных возможных вариантов строковых значений, которые ожидаются в кач-ве параметров твоей ф-ции, и выдели в них жирным подстроки, которые должна возвращать ф-ция ..
← →
palva © (2007-12-25 12:10) [90]
> Desdechado © (25.12.07 11:15) [88]
> > lstrcpy, lstrcpyA - это без разницы.
> Разница выделена.
Вообще да. Разница есть. В имени. Но я имел в виду, что без разницы, какое имя указывать. Это одна и та же функция.
{$APPTYPE CONSOLE}
uses Windows;
var
h: THandle;
f: FarProc;
begin
h := LoadLibrary("Kernel32.dll");
f := GetProcAddress(h, "lstrcpy");
WriteLn(Integer(f)); // 2088812033
f := GetProcAddress(h, "lstrcpyA");
WriteLn(Integer(f)); // 2088812033
end.
← →
Desdechado © (2007-12-25 12:15) [91]> palva © (25.12.07 12:10) [90]
Разница выделена была в том посте, который ты комментировал вначале. Это соглашение о вызовах stdcall.
А имена, которые ты зацепил, действительно синонимы, с этим я и не спорю.
← →
palva © (2007-12-25 13:10) [92]Desdechado © (25.12.07 12:15) [91]
OK
← →
irish_34 (2007-12-25 18:54) [93]
> Приведи десяток различных возможных вариантов строковых
> значений, которые ожидаются в кач-ве параметров твоей ф-
> ции, и выдели в них жирным подстроки, которые должна возвращать
> ф-ция ..
6,4,10
6(рез);7;103;5
6.8.12.10.9
6.21.15.21.5.21
6.15п.11.15
6.10 чпу
6.5.15.5.7.5.7.5
6.15(рихт.)8.15.13(шл.)8 чпу
← →
irish_34 (2007-12-25 18:56) [94]
> Что, проблема даже скопировать шаблон из [18] "один в один"
> ?)
Переделывала жи
← →
trubin © (2007-12-25 19:02) [95]Внимательно прочитай статью указанную в [1], хорошая статья
← →
irish_34 (2007-12-25 19:05) [96]
> Внимательно прочитай статью указанную в [1], хорошая статья
ды читала я, что конкретно не так-то?
← →
Сергей М. © (2007-12-26 09:22) [97]
> irish_34 (25.12.07 18:54) [93]
Т.е. в интересующих тебя строках 6-ка всегда является первым символом строки ? Или есль другие варианты, где 6-ка не первый символ ?
Например, 7.6.15п.11.15 ?
← →
irish_34 (2007-12-26 18:19) [98]6-ка всегда является первым символом строки
← →
Сергей М. © (2007-12-27 09:57) [99]Держи, горемычная)
DECLARE EXTERNAL FUNCTION CEX6
CSTRING(32767)
RETURNS PARAMETER 1
ENTRY_POINT "psc6" MODULE_NAME "PDL6.dll"
function psc6(AString:PChar):PChar; cdecl;
function ExtractSubstring(AString: String): String;
const
ld: PChar = ".,; ";
rd: PChar = ".,; )";
var
i,n,k,b: Integer;
function IsDelimiter(ADelimiters: PChar; ASymbol: Char): Boolean;
var
i: Integer;
begin
i := 0;
Result := False;
while (i < n) and not Result do
begin
Result := ASymbol = ADelimiters[i];
Inc(i);
end;
end;
begin
Result := "0";
if AString[1] <> "6" then Exit;
i := 2;
k := Length(AString);
n := StrLen(ld);
while (i <= k) and not IsDelimiter(ld, AString[i]) do Inc(i);
Inc(i);
b := i;
n := StrLen(rd);
while (i <= k) and not IsDelimiter(rd, AString[i]) do Inc(i);
Result := Copy(AString, b, i-b);
if Result="" then Result := "0";
end;
begin
Result := lstrcpy(AString, PChar(ExtractSubstring(AString)));
end;
← →
irish_34 (2007-12-28 20:48) [100]
> Держи, горемычная)
:* спасибо огромное, но и твоя и моя работают только начиная с 1.5 FB, а 1.0FB...даже и не знаю как он может работать с UDF.и я сделала проще установила 1.5
Страницы: 1 2 3 вся ветка
Текущий архив: 2008.01.27;
Скачать: CL | DM;
Память: 0.73 MB
Время: 0.019 c