Текущий архив: 2008.01.27;
Скачать: CL | DM;
Вниз
UDF Найти похожие ветки
← →
Сергей М. © (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]
> адо мне буду использовать менеджер памяти
А смысл?
Страницы: 1 2 3 вся ветка
Текущий архив: 2008.01.27;
Скачать: CL | DM;
Память: 0.63 MB
Время: 0.021 c