Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
15-1198175127
краснаЯ ГВАРДИЯ
2007-12-20 21:25
2008.01.27
задачи


15-1198017563
Dezigo
2007-12-19 01:39
2008.01.27
Калькулятор в строке


15-1198152858
Сергей М.
2007-12-20 15:14
2008.01.27
О файрволах и платформах


3-1190019847
alsov
2007-09-17 13:04
2008.01.27
Сумма (среднее и т.д) по выборке


2-1197532090
operator
2007-12-13 10:48
2008.01.27
Прорисовка по скроллингу в TStringGrid!