Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
15-1189158558
Сергей2006
2007-09-07 13:49
2007.10.07
unable to locate hyperlink в Help Insight


15-1189390927
Slider007
2007-09-10 06:22
2007.10.07
С днем рождения ! 10 сентября 2007 понедельник


2-1189264124
AIK
2007-09-08 19:08
2007.10.07
Диспетчер задач


1-1185274957
race1
2007-07-24 15:02
2007.10.07
Сервис и настройки


2-1189486797
no_name
2007-09-11 08:59
2007.10.07
Как поместить созданный мной компонент в список ActiveX





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский