Текущий архив: 2007.10.07;
Скачать: CL | DM;
Вниз
Удалить подстроку из очень большой строки (больше 2 ГБ ) Найти похожие ветки
← →
Palladin © (2007-09-07 21:02) [40]
> ЗЫ: Я то понимаю ))
неужели? а с чего ты вдруг параметр объявленный как String приводишь к PChar и присваиваешь по указателю Pointer(s) (где s:String) какоето значение? я вообще не понимаю каким боком PChar сюда притесался то? пресловутая совместимость PChar и String не так совместима как ты думаешь... String это отнюдь не указатель на что то в памяти...
← →
Инс © (2007-09-07 21:05) [41]
> неужели?
Сейчас я вам это докажу, будьте сдержанней :))
> String это отнюдь не указатель на что то в памяти...
Скажем так, для компилятора - это нечто сложнее, а для процессора - именно указатель.
Значит все-таки "!orm1"? Так? Подтвердите мои слова, бо я не знаю, можно ли продолжать спор?
← →
Dib@zol © (2007-09-07 21:06) [42]> Значит все-таки "!orm1"? Так?
Неа. !orm2. гыгыгы. Но тем не менее первый символ - это "!", подтверждаю.
← →
Palladin © (2007-09-07 21:10) [43]
> Инс © (07.09.07 21:05) [41]
прошу прощения... "!orm"... обшибся... да, позор на мою голову... пепел и все такое просто F и ! очень похожи...
просто мне инетресно, а что это должно было доказать то?
← →
Инс © (2007-09-07 21:12) [44]
> String это отнюдь не указатель на что то в памяти...
Если точнее, String - это 4-байтный тип, который по своему смыслу является указателем на первый символ строки в динамической памяти. По смещению -4 от первого символа хранится длина этой строки, по смещению -8 - счетчик ссылок. Строка завершается нулевым символом. Для компилятора - это не просто указатель, это сложный финализируемый тип, для которого он формирует особый код.
← →
Dib@zol © (2007-09-07 21:13) [45]> Здесь причина дубляжа - это операция Copy, а не передача
> строки в процедуру. При передачи строки дубляж не происходит,
> копируется указатель.
Доходчиво?
← →
Инс © (2007-09-07 21:14) [46]
> просто мне инетресно, а что это должно было доказать то?
То, что при передаче строки параметром в процедуру дубляжа не происходит, как вы написали в [8], не зависимо от слова var. До сих пор не согласны? Можем продолжить спор.
← →
Palladin © (2007-09-07 21:17) [47]
> Инс © (07.09.07 21:12) [44]
Это мне? Прекрасно знаю..
Цель? Доказать мне что то...
Только что понять не могу...
> Dib@zol © (07.09.07 21:13) [45]
Доходчиво кому и в связи с чем?
> операция со
> строкой не переданной как var приводит к ее дубляжу и модификации
> дубликата... особенно при выполнении del()... информация
> переданная в идентификаторе параметром должна остаться не
> тронутой..
доходчиво?
← →
Инс © (2007-09-07 21:18) [48]
> > операция со
> > строкой не переданной как var приводит к ее дубляжу и
> модификации
> > дубликата... особенно при выполнении del()... информация
>
> > переданная в идентификаторе параметром должна остаться
> не
> > тронутой..
Спорим! :)) На ящик пива! А?
← →
Palladin © (2007-09-07 21:18) [49]
> Инс © (07.09.07 21:14) [46]
опа... где это я написал в [8]... перечитай пожалуйста...
← →
Palladin © (2007-09-07 21:18) [50]
> Инс © (07.09.07 21:18) [48]
спорим...
← →
Инс © (2007-09-07 21:23) [51]
> опа... где это я написал в [8]... перечитай пожалуйста...
Перечитал. Вот она причина. Мне почему-то показалось, что вы имеете в виду [46]. Тогда ладно, верю. Тоже посыпаю голову пеплом. ;) Приезжай на пиво!
← →
Инс © (2007-09-07 21:28) [52]Операция действительно приводит к дублированию строки вследствие неявного вызова UniqueStringA. Но не сама передача.
← →
Palladin © (2007-09-07 21:32) [53]
> Инс © (07.09.07 21:23) [51]
а оно очень часто так и бывает... изза не внимательного прочтения... сдаста случай приеду... :)
← →
Инс © (2007-09-07 21:35) [54]
> [53] Palladin © (07.09.07 21:32)
Да уж, как закончу с Руссиновичем, сажусь за букварь учиться читать... Звиняй, если чем обидел, ибо был неправ.
← →
Palladin © (2007-09-07 21:37) [55]
> Инс © (07.09.07 21:28) [52]
нет конечно, сама передача string конечно осуществляет сам string во всей его сущности... вместе со счетчиком... правда, конечно, механизм передачи string разный в delphi и origial pascal... для этого и есть, такая великая вещь как, const :)
← →
Инс © (2007-09-07 21:38) [56]
> [55] Palladin © (07.09.07 21:37)
Бррр, казнить нельзя помиловать... Можно со знаками препинания?
← →
Palladin © (2007-09-07 21:49) [57]если кратко, то я хотел сказать, что, естественно, сам факт передачи переменной типа String в Delphi параметром процедуры(функции) ниразу не означает дубляжа информации содержащейся в переменной типа String :)
← →
Инс © (2007-09-07 21:54) [58]
> [57] Palladin © (07.09.07 21:49)
Ну да, я типа об этом и кричу, вот уже где-то десяток постов... И еще думаю, как же "Мастер Delphi" - и не знает такой простой вещи... ))) Приятно, что все-таки знает. Ладно, нормальное обсуждение получилось. Для рядового читателя может быть много нового интересного.
← →
reonid © (2007-09-07 22:37) [59]Несколько замечаний.
Если строка действительно большая,
возможно, стоит использовать специальные методы поиска, вроде
http://www.rsdn.ru/article/alg/textsearch.xml
Далее, так как подстрок может быть много,
неэффективно при удалении подстроки перемещать (Move)
кусок от конца вхождения подстроки до конца строки.
Лучше перемещать кусками от конца одного вхождения
до начала следующего.
← →
oxffff © (2007-09-08 10:39) [60]
> Инс © (07.09.07 20:48) [34]
> А если сделаете не так:
> s:=Caption;
> а так:
> s:="12345";
> то получите AV. Знаете почему? ;)
А у меня нет AV.
procedure abc(s:string);
begin
pchar(s)^:="!";
end;
procedure TForm1.Button1Click(Sender: TObject);
var a:string;
Old:DWORD;
begin
a:="34322314";
VirtualProtect(pointer(a),length(a),PAGE_EXECUTE_READWRITE,Old);
abc(a);
showmessage(a);
end;
← →
Sha © (2007-09-08 11:09) [61]> Rial © (07.09.07 19:48) [25]
sValue[P] :=sValue[P1]; //Сводим на нет всю оптимизацию
Избавиться от вызовов Uniquestring можно, например, так:procedure DeleteString(var s: string; const t: string);
var
i, pto, pfrom, count, tlen: integer;
q: pchar;
begin;
pto:=Pos(t,s);
if pto>0 then begin;
tlen:=Length(t);
q:=pointer(s); //чтобы компилятор не вставлял вызовы UniqueString
repeat;
pfrom:=pto+tlen;
i:=PosEx(t,s,pfrom);
if i=0 then count:=Length(s)+1 else count:=i;
dec(count,pfrom);
Move(q[pfrom-1],q[pto-1],count);
inc(pto,count)
until i=0;
SetLength(s,pto-1);
end;
end;
← →
Sha © (2007-09-08 11:15) [62]Вкралась ошибка, правильно будет так:
procedure DeleteString(var s: string; const t: string);
var
i, pto, pfrom, count, tlen: integer;
q: pchar;
begin;
i:=Pos(t,s);
if i>0 then begin;
tlen:=Length(t);
q:=pointer(s); //чтобы компилятор не вставлял вызовы UniqueString
pto:=i;
repeat;
pfrom:=i+tlen;
i:=PosEx(t,s,pfrom);
if i=0 then count:=Length(s)+1 else count:=i;
dec(count,pfrom);
Move(q[pfrom-1],q[pto-1],count);
inc(pto,count)
until i=0;
SetLength(s,pto-1);
end;
end;
← →
Инс © (2007-09-08 15:46) [63]
> А у меня нет AV.
Поздравляю.
← →
Dib@zol © (2007-09-08 15:48) [64]> [63] Инс © (08.09.07 15:46)
Да! А у меня ить тоже не было ж!
← →
Инс © (2007-09-08 15:54) [65]
> Да! А у меня ить тоже не было ж!
А чем мой код отличается от oxffff?
← →
Dib@zol © (2007-09-08 15:58) [66]> [65] Инс © (08.09.07 15:54)
Дык ничем! О том и речь, что при таком раскладе АВ не возникает!
← →
Инс © (2007-09-08 16:01) [67]
> Дык ничем!
Ой ли ничем? А где в моем коде VirtualProtect? ;-)
← →
oxffff © (2007-09-08 16:01) [68]
> Инс © (08.09.07 15:54) [65]
>
> > Да! А у меня ить тоже не было ж!
>
> А чем мой код отличается от oxffff?
VirtualProtect(pointer(a),length(a),PAGE_EXECUTE_READWRITE,Old);
← →
Dib@zol © (2007-09-08 16:03) [69]> [67] Инс © (08.09.07 16:01)
Тфублн. Я твой код а не этот на предмет Аксесса Виалейшна тестировал.
← →
Sha © (2007-09-08 18:32) [70]> oxffff © (07.09.07 19:28) [22]
В твоей совершенно замечаьельной процедуре имеется грубая,
но трудноуловимая ощибка.
Попробуй угадать, что будет выдано, если вызвать ее так:procedure TForm1.Button5Click(Sender: TObject);
var
a, b: string;
begin
a:="123456789"; FastDel(a,2,3); ShowMessage(a);
a:="123456789"; FastDel(a,2,3); ShowMessage(a);
b:="123456789"; ShowMessage(a);
end;
← →
Sha © (2007-09-08 18:34) [71]Посдедняя строка должна выглядеть так
b:="123456789"; ShowMessage(b);
Но в данном случае это совершенно не важно :)
← →
Riply © (2007-09-08 21:54) [72]>[70] Sha © (08.09.07 18:32)
> В твоей совершенно замечаьельной процедуре имеется грубая,
> но трудноуловимая ощибка.
Пересечение областей копирования ?
← →
Sha © (2007-09-08 23:03) [73]> Riply © (08.09.07 21:54) [72]
> Пересечение областей копирования ?
Хуже. И намного прикольнее. Скомпилируй - не пожалеешь :)
← →
Riply © (2007-09-09 09:45) [74]>[73] Sha © (08.09.07 23:03)
> Хуже. И намного прикольнее.
Неувязочка в том, что у строки "a" RefCount = -1 ?
← →
Sha © (2007-09-09 11:44) [75]> Riply © (09.09.07 09:45)
> Неувязочка в том, что у строки "a" RefCount = -1 ?
Ага, и параметр объявлен как const.
Попытка изменить строку-константу.
← →
oxffff © (2007-09-09 13:34) [76]
> Sha © (08.09.07 18:32) [70]
> > oxffff © (07.09.07 19:28) [22]
>
> В твоей совершенно замечаьельной процедуре имеется грубая,
>
> но трудноуловимая ощибка.
>
> Попробуй угадать, что будет выдано, если вызвать ее так:
>
>
> procedure TForm1.Button5Click(Sender: TObject);
> var
> a, b: string;
> begin
> a:="123456789"; FastDel(a,2,3); ShowMessage(a);
> a:="123456789"; FastDel(a,2,3); ShowMessage(a);
> b:="123456789"; ShowMessage(a);
> end;
А [60] не смотрели?
VirtualProtect?
← →
oxffff © (2007-09-09 13:41) [77]
> Sha © (09.09.07 11:44) [75]
> > Riply © (09.09.07 09:45)
> > Неувязочка в том, что у строки "a" RefCount = -1 ?
>
> Ага, и параметр объявлен как const.
> Попытка изменить строку-константу.
Const сделан для того, чтобы не тратить время на _LStrAddRef, _LStrClr
← →
MetalFan © (2007-09-09 16:06) [78]Во в дебри вас занесло, товарищи)
← →
Denis_ © (2007-09-09 18:48) [79]
> 2 ГБ - строка средних размеров. Используется, например,
> в качестве заголовка окна.
> На строках большой длины (от 4 ГБ) не проверял, так как
> почти не приходилось работать с именами файлов. %)
ТАК. ЛИБО ЭТО ШУТКА, ЛИБО "ГБ" значит не "гигобайт", а нечто другое, мне не известное.
← →
Sha © (2007-09-09 19:30) [80]> oxffff © (09.09.07 13:34)
Ты на вопрос ответь, что будет выдано твоей процедурой из [22] ?function FastDel(const A:string;Pos,Count:integer):boolean;
var pi:pinteger;
begin
result:=false;
if (length(a)+1<pos+count) or (pos<1) then exit;
CopyMemory(pointer(DWORD(A)+Pos-1),pointer(DWORD(A)+Pos+Count-1),length(a)-pos-count+2);
pi:=pointer(a);
dec(pi);
PI^:=PI^-count;
result:=true;
end
с любыми прибамбасами типаVirtualProtect(pointer(a),length(a),PAGE_EXECUTE_READWRITE,Old);
при такой последовательности вызовов:procedure TForm1.Button5Click(Sender: TObject);
var
a, b: string;
begin
a:="123456789"; FastDel(a,2,3); ShowMessage(a);
a:="123456789"; FastDel(a,2,3); ShowMessage(a);
a:="123456789"; ShowMessage(a);
end;
И что ожидает увидеть неподготовленный :) человек ?
Страницы: 1 2 3 4 вся ветка
Текущий архив: 2007.10.07;
Скачать: CL | DM;
Память: 0.62 MB
Время: 0.137 c