Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
15-1198086649
Avds
2007-12-19 20:50
2008.01.27
Помогите вычислить вирус


2-1198516710
OpTiKaL
2007-12-24 20:18
2008.01.27
Изменить цвет строки выделения.


15-1198261465
guav
2007-12-21 21:24
2008.01.27
Race condition


15-1197925136
Petr V. Abramov
2007-12-17 23:58
2008.01.27
а как бы for поменять на


2-1198666689
авыф
2007-12-26 13:58
2008.01.27
query