Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.07;
Скачать: CL | DM;

Вниз

Удалить подстроку из очень большой строки (больше 2 ГБ )   Найти похожие ветки 

 
*Ray* ©   (2007-09-07 18:42) [0]

Здравствуйте, уважаемые мастера! Столкнулся со стандартной вроде бы задачей, но с интересного ракурса. Задача проста: Нужно написать функцию, удаляющую все вхождение подстроки в строке. Но есть одно условие: строка очень большая - около 2 Гб, может и больше, и нужно чтобы функция была максимально оптимизирована. Вот здесь я немного теряюсь.

Я сделал так:
Function Del_Str (longstring, string: string):string;
begin
    while pos(str, longsting)>0 do
          begin
                del(longstring, pos(str, longstring), length(str)) ;
          end;
    result:=longstring;  
end;

Функция работает, но одно даже присваивание result значение longstring займет в памяти 4 Гб, если строка 2 Гб. Не говря уже о других операциях. Надо что-то придумать.

Заранее всем ольшое спасибо за предложенные варианты!


 
Riply ©   (2007-09-07 18:47) [1]

> [0] *Ray* ©   (07.09.07 18:42)
А с маленькими строками она работает ?


 
Юрий Зотов ©   (2007-09-07 18:55) [2]

> *Ray* ©   (07.09.07 18:42)  

> одно даже присваивание result значение longstring займет в памяти 4 Гб,
> если строка 2 Гб.

Не займет. При присваивании строковых переменных копия строки не создается, просто увеличивается счетчик ссылок на строку.


 
DVM ©   (2007-09-07 18:56) [3]


> *Ray* ©

Лучше строку хранить в файле на диске и далее создать временный файл и переписывать туда все, кроме того, что требуется удалять. После переименовать исходный файл, на его место переименовать временный и если все ок, то удалить исходный.


 
Инс ©   (2007-09-07 18:57) [4]


> Задача проста: Нужно написать функцию, удаляющую все вхождение
> подстроки в строке. Но есть одно условие: строка очень большая
> - около 2 Гб, может и больше

И как же она уместится в виртуальном адресном пространстве процесса на Win32?


> Функция работает, но одно даже присваивание result значение
> longstring займет в памяти 4 Гб, если строка 2 Гб.

Нет. result:=longstring; - это просто копирование указателя.


 
*Ray* ©   (2007-09-07 18:59) [5]

А если обойтись без файла, можно как то дополнительно оптимизировать? ПУсть даже хоть немного, но лучше? Чтобы быстрее работало.


 
Riply ©   (2007-09-07 19:01) [6]

> [5] *Ray* ©   (07.09.07 18:59)
Например, не считать pos(str, longstring) два раза :)


 
Инс ©   (2007-09-07 19:01) [7]


> [5] *Ray* ©   (07.09.07 18:59)

Оно вообще не будет работать на Win32. Только если проецировать строку в память из файла частями.


 
Palladin ©   (2007-09-07 19:02) [8]


> Юрий Зотов ©   (07.09.07 18:55) [2]

есть одно но... даже несколько...
во первых функции Del_Str (longstring, string: string) существовать не может, бо string reserved word, во вторых операция со строкой не переданной как var приводит к ее дубляжу и модификации дубликата... особенно при выполнении del()... информация переданная в идентификаторе параметром должна остаться не тронутой...

экзампл

procedure pp(s:String);
Begin
s:=copy(s,1,1);
showmessage(s);
End;

procedure TForm1.Button1Click(Sender: TObject);
var
s:String;
begin
s:="12345";
pp(s);
showmessage(s);
end;


что бы удалить что то из подстроки, без лишнего расхода памяти придется таки использовать var в описании параметров процедуры или функции


 
DVM ©   (2007-09-07 19:08) [9]


> А если обойтись без файла, можно как то дополнительно оптимизировать?

То, что ты написал переписать вообще. Кстати, ты ведь ищешь что-то фиксированное, если да, то можно написать функции, работющие быстрее Pos().

А насчет файла. Зачем тебе такая строка в памяти. Ты же ее все равно потом сохранять будешь. Или нет?


 
*Ray* ©   (2007-09-07 19:13) [10]

to Riply:

Например, не считать pos(str, longstring) два раза :)


to Palladin:

> что бы удалить что то из подстроки, без лишнего расхода
> памяти придется таки использовать var в описании параметров
> процедуры или функции


тогда получается так:

Function Del_Str (var longstring, str: string):string;
var k:integer;
begin
   k:=pos(str, longsting);
   while k>0 do
         begin
               del(longstring, k, length(str)) ;
         end;
   result:=longstring;  
end;

Что-нибудь еще можно улучшить?


 
Инс ©   (2007-09-07 19:15) [11]


> [10] *Ray* ©   (07.09.07 19:13)

Вы читать вообще умеете? [4] и [7] прочтите еще раз. Будут вопросы по этому поводу - задавайте.


 
*Ray* ©   (2007-09-07 19:15) [12]

точнее
Function Del_Str (var longstring, str: string):string;
var k:integer;
begin
  k:=pos(str, longsting);
  while k>0 do
        begin
              del(longstring, k, length(str)) ;
              k:=pos(str, longsting);
        end;
  result:=longstring;  
end;


 
Palladin ©   (2007-09-07 19:16) [13]

ну во первых вопрос, тебе только одну подстроку str (кстати тоже не рекомендую использовать идентификатор с таким названием) удалить из строки или все?


 
*Ray* ©   (2007-09-07 19:19) [14]

2 Palladin:

> ну во первых вопрос, тебе только одну подстроку str (кстати
> тоже не рекомендую использовать идентификатор с таким названием)
> удалить из строки или все?


нужно удалить все вхождения подстроки. А почему нельзя использовать даже "str?


 
Юрий Зотов ©   (2007-09-07 19:20) [15]

> Palladin ©   (07.09.07 19:02) [8]

Тоже есть одно но... я говорил о присвоении (на что явно указал цитатой) и нигде ни разу не говорил об изменении.

Что же касаетеся изменений (т.е., сабжа), то сама постановка задачи представляется настолько странной, что лучше промолчать. Вот почему.

4 Гб - вся память. Из них верхние 2 Гб и нижние 64 Кб резервируются системой. Минус статическая память и стек. Под хип остается явно менее 2 Гб и поэтому непонятно, откуда вообще взялась строка длиной "около 2 Гб, может и больше".

Тут явно что-то недосказано, поэтому - какие можно дать рекомендации, не зная задачи?


 
*Ray* ©   (2007-09-07 19:20) [16]

to Инс

> Оно вообще не будет работать на Win32. Только если проецировать
> строку в память из файла частями.


Объясните пожалуйста поподробнее. Прошу прощения, что сразу не заметил.


 
Вася Правильный   (2007-09-07 19:21) [17]


> большой строки (больше 2 ГБ )

из справки
String types
Type Maximum length Memory required Used for
ShortString 255 characters 2 to 256 bytes backward compatibility
AnsiString ~2^31 characters 4 bytes to 2GB 8-bit (ANSI) characters, DBCS ANSI, MBCS ANSI, etc.
WideString ~2^30 characters 4 bytes to 2GB Unicode characters; multi-user servers and multi-language applications


 
Dib@zol ©   (2007-09-07 19:22) [18]

Ваще убит наповал... ОТКУДА берутся такие строки???????


 
*Ray* ©   (2007-09-07 19:23) [19]

to Юрий Зотов:

Вполне возможно, что с 2 Гб я преувеличил. Я просто хотел сказать, что строка очень большая, и при обработке строки будет занято много ресурсов и поэтому даже малейшая оптимизация будет существенна.


 
*Ray* ©   (2007-09-07 19:26) [20]

Спасибо всем большое за новые знания! Я понял что 2 Гб-это нереально. Может вы напишите как Вы бы работали просто с очень большой строкой, не будет конкретизировать размер. Может это совсем будет по-другому, чем у меня.


 
Riply ©   (2007-09-07 19:27) [21]

> [20] *Ray* ©   (07.09.07 19:26)
Можно попробовать посчитать кол-во вхождений SubStr в LongString при помощи PosEx
Один раз сделать SetLength(Result,..) , и в него переместить подстроки Move()


 
oxffff ©   (2007-09-07 19:28) [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;

procedure TForm1.Button1Click(Sender: TObject);
var a,b:string;
   c:pointer;
begin
a:="abc"+"dfs";
b:=a+"asdf";
FastDel(b,3,8);
showmessage(b);
end;


 
Palladin ©   (2007-09-07 19:33) [23]


> *Ray* ©

я не сказал нельзя, я сказал, что не рекомендую, бо str одно из стандартных ключевых слов Паскаля... да и 2Гб это вполне реально, на 64x системах и 64x приложениях..
у Riply ©   (07.09.07 19:27) [21] хорошо описан механизм "дефрагментации" строки... нужно его релизовать используя > oxffff ©   (07.09.07 19:28) [22]


> Юрий Зотов ©   (07.09.07 19:20) [15]

"но" принято... 1 : 0.5 :)


 
Denis_ ©   (2007-09-07 19:40) [24]


> Dib@zol ©   (07.09.07 19:22) [18]
> Ваще убит наповал... ОТКУДА берутся такие строки???????


Тебя что то смущает? (с)Anatoly Podgoretsky


 
Rial ©   (2007-09-07 19:48) [25]

procedure DelInsides(Var sValue : String; Const sSubString : String);
Var
   L   : Integer;
   LS  : Integer;
   Tmp : Integer;
   P   : Integer;
   P1  : Integer;
   P2  : Integer;
   PS  : Integer;
begin
L   :=Length(sValue);
LS  :=Length(sSubString);
Tmp :=L - LS + 1;
P1  :=1;
P   :=1;
While (P1 <= Tmp)do begin
 PS :=1;
 P2 :=P1;
 While(PS <= LS)and(sValue[P2] = sSubString[PS]) do begin
  Inc(P2);
  Inc(PS);
 end;
 If(PS > LS)then begin
  P1 :=P2;
 end else begin
  sValue[P] :=sValue[P1];
  Inc(P1);
  Inc(P);
 end;
end;
If(P1 < L)then begin
 Tmp :=L - P1 + 1;
 Move(sValue[P1], sValue[P], Tmp);
 Inc(P, Tmp);
end;
SetLength(sValue, P - 1);
end;


Можно еще кое-что оптимизировать, конечно,
но для строк небольшой длины мне хватало.


 
Denis_ ©   (2007-09-07 19:49) [26]


> небольшой длины

2 ГБ?!


 
Инс ©   (2007-09-07 20:14) [27]


> Объясните пожалуйста поподробнее. Прошу прощения, что сразу
> не заметил.

Юрий Зотов уже объяснил. 2 Гб адресного пространства всего доступно приложению в Win32 (еще два - система забирает под свои нужды). Из этих двух часть будет уже занята.


 
Rial ©   (2007-09-07 20:15) [28]

> [26] Denis_ ©   (07.09.07 19:49)
> > небольшой длины
> 2 ГБ?!

2 ГБ - строка средних размеров. Используется, например,
в качестве заголовка окна.
На строках большой длины (от 4 ГБ) не проверял, так как
почти не приходилось работать с именами файлов. %)


 
Palladin ©   (2007-09-07 20:22) [29]


> Инс ©   (07.09.07 20:14) [27]


Юрий акцентирует внимание на циферках потому, что человек (в природе у него заложено, зря писал чтоли :) ) не может абсолютно принять несущественность своей реплики и его ответ конечно автору не посуществу...

его пост абсолютно верен, но понимания происходящего приносит гораздо меньше чем мое замечание...

и я Юрия понимаю потому что сам такой же :)
да не обидится на меня мэтр :)


 
Инс ©   (2007-09-07 20:27) [30]


> [29] Palladin ©   (07.09.07 20:22)

Не совсем понял смысл Вашего комментария. Я в своем ответе сослался на уважаемого тезку из-за того, что меня попросили объяснить мои посты [4] и [7]. Заметив, что все, что хотел по этому поводу сказать я, уже сказано, мне нечего другого не оставалось, как сослаться на это. Да и добавить в общем то нечего, как мне этого не хотелось.


 
Инс ©   (2007-09-07 20:32) [31]


> не может абсолютно принять несущественность своей реплики
> и его ответ конечно автору не посуществу...

Кстати, совершенно с этим несогласен. Считаю, что в изначальной формулеровке, любой ответ не по существу (даже более того - неверный), кроме того, что на Win32 это невозможно, потому что (см. выше).


 
Palladin ©   (2007-09-07 20:33) [32]


> Инс ©   (07.09.07 20:27) [30]

объясню...

[4], [7] это рассказ автору о том, что он описывает что то не реальное и такого вообще быть не может...

[8],[21],[22] объяснение ситуации и практические рекомендации по работе с большими объемами данных... потому что портировать функциональность move (Copy/Move Mem на работу с файлами большого объема не составляет труда)


 
Инс ©   (2007-09-07 20:44) [33]


> [8],[21],[22] объяснение ситуации и практические рекомендации
> по работе с большими объемами данных... потому что портировать
> функциональность move (Copy/Move Mem на работу с файлами
> большого объема не составляет труда)

Плохое объяснение, так как неверное, а именно:

> во вторых операция со строкой не переданной как var приводит
> к ее дубляжу и модификации дубликата

Здесь причина дубляжа - это операция Copy, а не передача строки в процедуру. При передачи строки дубляж не происходит, копируется указатель. В доказательство - код:
procedure pp(s:String);
Begin
 PChar(s)^:="!";
End;

procedure TForm1.Button1Click(Sender: TObject);
var
 s:String;
begin
 s:=Caption;
 pp(s);
 showmessage(s);
end;


 
Инс ©   (2007-09-07 20:48) [34]

А если сделаете не так:
s:=Caption;
а так:
s:="12345";
то получите AV. Знаете почему? ;)


 
Palladin ©   (2007-09-07 20:52) [35]

:) я что то не пойму... что этот код должен показать? ну вышло у меня сообщение "Form1", так я это и (до/по)казывал вообще то :)

в своем коде я показывал то, что работы по модифицированию string параметров процедуры передаваемых не по ссылке (var не указанно в параметрах) обязательно будут проводить к созданию другого string (а так оно и есть по все канонимам паскаля), другое дело что, если модифицирование строки переданной без var не происходит, тут Юрий прав абсолютно счетчик просто увеличивается... потому и 1 : 0.5


 
Инс ©   (2007-09-07 20:54) [36]


> ну вышло у меня сообщение "Form1", так я это и (до/по)казывал
> вообще то :)

Что, скопировать не смогли правильно??? Ну-ка еще раз ;) Или может голосование устроим, какое сообщение появилось :)))


 
Palladin ©   (2007-09-07 20:55) [37]


> Инс ©   (07.09.07 20:48) [34]

ну естественно,что дальше то? надеюсь ты понимаешь разницу между String и PChar?


 
Инс ©   (2007-09-07 20:56) [38]


> ну естественно,что дальше то? надеюсь ты понимаешь разницу
> между String и PChar?

Какое сообщение выскачило, прежде чем двигаться дальше?

ЗЫ: Я то понимаю ))


 
Инс ©   (2007-09-07 20:58) [39]

Кстати, не нравится PChar, давайте сделаем так:
PByte(s)^:=Ord("!");

суть не изменится


 
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;


И что ожидает увидеть неподготовленный :) человек ?


 
Юрий Зотов ©   (2007-09-09 20:04) [81]

> Palladin ©   (07.09.07 20:22) [29]

Мэтр, конечно, не обиделся, а улыбнулся. И если Вы прочтете [28], то тоже улыбнетесь. Поскольку мэтр оказался-таки прав, сочтя, что лучший ответ на ТАКОЙ сабж - молчание.

Они такие, панимашь, эти мэтры с киломэтрами, их на развод так просто не купишь...
:о)


 
oxffff ©   (2007-09-09 20:06) [82]


> И что ожидает увидеть неподготовленный :) человек ?


Неподготовленный вынуждает компилятор сделать две копии.

function FastDel(const A:string;Pos,Count:integer):boolean;
var pi:pinteger;
   Old:DWORD;
begin
VirtualProtect(pointer(a),length(a),PAGE_EXECUTE_READWRITE,Old);
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;

procedure TForm1.Button1Click(Sender: TObject);
const
    a1:string="123456789";
    a2:string="123456789";
begin
FastDel(a1,2,3);  ShowMessage(a1);
FastDel(a2,2,3);  ShowMessage(a2);
ShowMessage(a1);
end;


 
oxffff ©   (2007-09-09 20:15) [83]


> Инс ©   (07.09.07 20:14) [27]
>
> > Объясните пожалуйста поподробнее. Прошу прощения, что
> сразу
> > не заметил.
>
> Юрий Зотов уже объяснил. 2 Гб адресного пространства всего
> доступно приложению в Win32 (еще два - система забирает
> под свои нужды). Из этих двух часть будет уже занята.


Есть еще /3GB.

А еще PAE и AWE.


 
Инс ©   (2007-09-09 20:22) [84]


> Есть еще /3GB.

Я может не знаю все опций и директив компилятору, но где в Delphi можно задать, чтобы программа компилировалась с таким флажком? Даже если и сделать такое приложение, >2GB сплошной блок в памяти в нем все равно скорее всего не выделишь.


 
Anatoly Podgoretsky ©   (2007-09-09 20:25) [85]

> oxffff  (09.09.2007 20:15:23)  [83]

Есть и что они доступны в Дельфи

string = 2^31
integer тоже самое, а вся индексация идет через него


 
oxffff ©   (2007-09-09 20:28) [86]


> Инс ©   (09.09.07 20:22) [84]
>
> > Есть еще /3GB.
>
> Я может не знаю все опций и директив компилятору, но где
> в Delphi можно задать, чтобы программа компилировалась с
> таким флажком? Даже если и сделать такое приложение, >2GB
> сплошной блок в памяти в нем все равно скорее всего не выделишь.
>


Это ключ в boot.ini


 
Инс ©   (2007-09-09 20:40) [87]


> Это ключ в boot.ini

Не на всех версиях системы есть такой ключ. Есть еще директива линкеру на C++  /LARGEADDRESSAWARE. В Delphi ее нет.


 
oxffff ©   (2007-09-09 20:41) [88]


> Anatoly Podgoretsky ©   (09.09.07 20:25) [85]
> > oxffff  (09.09.2007 20:15:23)  [83]
>
> Есть и что они доступны в Дельфи
>
> string = 2^31
> integer тоже самое, а вся индексация идет через него


Согласен.

Я только поправил. :)


 
oxffff ©   (2007-09-09 20:43) [89]


> Инс ©   (09.09.07 20:40) [87]
>
> > Это ключ в boot.ini
>
> Не на всех версиях системы есть такой ключ. Есть еще директива
> линкеру на C++  /LARGEADDRESSAWARE. В Delphi ее нет.


Тогда AWE

AWE solves this problem by allowing applications to directly address huge amounts of memory while continuing to use 32-bit pointers. AWE allows applications to have data caches larger than 4GB (where sufficient physical memory is present). AWE uses physical nonpaged memory and window views of various portions of this physical memory within a 32-bit virtual address space.


 
Инс ©   (2007-09-09 20:44) [90]


> [89] oxffff ©   (09.09.07 20:43)

И что?


 
Anatoly Podgoretsky ©   (2007-09-09 20:49) [91]

> oxffff  (09.09.2007 20:41:28)  [88]

Я так и понял, хоть система может отдать более 2 гб процессу, но все процесс в состоянии с этим работать и из-за этого могут возникнуть проблемы на уровне ОС и процесса.


 
Anatoly Podgoretsky ©   (2007-09-09 20:56) [92]

> Инс  (09.09.2007 20:44:30)  [90]

Тот же вопрос хотел бы задать.


 
oxffff ©   (2007-09-09 21:04) [93]


> Инс ©   (09.09.07 20:44) [90]
>
> > [89] oxffff ©   (09.09.07 20:43)
>
> И что?


> Anatoly Podgoretsky ©   (09.09.07 20:56) [92]
> > Инс  (09.09.2007 20:44:30)  [90]
>
> Тот же вопрос хотел бы задать.


Читаем Инс ©   (07.09.07 20:14) [27]

О каком пространстве идет речь виртуальном, линейном, физическом.
Поэтому я поправил и уточнил, что принципиально возможно использовать более 2 gb памяти.


 
Инс ©   (2007-09-09 21:05) [94]


> [93] oxffff ©   (09.09.07 21:04)

О виртуальном. Читай [4]


 
oxffff ©   (2007-09-09 21:15) [95]


> Инс ©   (09.09.07 21:05) [94]
>
> > [93] oxffff ©   (09.09.07 21:04)
>
> О виртуальном. Читай [4]


Anatoly Podgoretsky ©   (09.09.07 20:25) [85]
> oxffff  (09.09.2007 20:15:23)  [83]

>Есть и что они доступны в Дельфи

>string = 2^31
>integer тоже самое, а вся индексация идет через него


Что принципиально ограничивает вас работать со строкой >2-3GB?


 
Инс ©   (2007-09-09 21:17) [96]


> Что принципиально ограничивает вас работать со строкой >2-3GB?

Как с целым неразрывным блоком данных - да. Как с типом string - да.


 
Anatoly Podgoretsky ©   (2007-09-09 21:17) [97]

> oxffff  (09.09.2007 21:15:35)  [95]

Строка это что? string - тогда это индекс, array [] of char - тогда тоже индекс.
Файл - ни что не ограничивает, как и в 16 бит, кроме ограничений ОС


 
Anatoly Podgoretsky ©   (2007-09-09 21:18) [98]

> Инс  (09.09.2007 21:17:36)  [96]

Компилятор не позволит создать суммарную длину структур + код, свыше 2 гб.


 
MetalFan ©   (2007-09-09 21:26) [99]

если вдруг мне бы пришлось решать подобную(subj) задачу, я бы использовал MMF и не парил бы окружающим мозг в попытке отхавать у системы более 2Гб памяти... тем более для сабжевой задачи это(отхавывание) абсолютно не нужно.


 
Riply ©   (2007-09-09 21:45) [100]

>[82] oxffff © (09.09.07 20:06)
Почему ты рассматриваешь только "свою" проверку ?
Потестируй не на своем примере, а на
контрпримере, предложенным в [80] Sha © (09.09.07 19:30),
"буква в букву", а именно:
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;
Будешь удивлен. Правда :)


 
Riply ©   (2007-09-09 21:47) [101]

> [100] Riply ©   (09.09.07 21:45)
P.S.
Имелась ввиду последняя версия FastDel, предложенная тобой.


 
oxffff ©   (2007-09-09 21:56) [102]


> Инс ©   (09.09.07 21:17) [96]
>
> > Что принципиально ограничивает вас работать со строкой
> >2-3GB?
>
> Как с целым неразрывным блоком данных - да. Как с типом
> string - да.


Что да?


> Anatoly Podgoretsky ©   (09.09.07 21:17) [97]
> > oxffff  (09.09.2007 21:15:35)  [95]
>
> Строка это что? string - тогда это индекс, array [] of char
> - тогда тоже индекс.
> Файл - ни что не ограничивает, как и в 16 бит, кроме ограничений
> ОС


Используйте pchar и будет вам счастье.

Либо сделайте аналог string типа c заголовком

 StrRecEx = packed record
   refCnt: int64;
   length:int64 ;
 end;


> MetalFan ©   (09.09.07 21:26) [99]
> если вдруг мне бы пришлось решать подобную(subj) задачу,
>  я бы использовал MMF и не парил бы окружающим мозг в попытке
> отхавать у системы более 2Гб памяти... тем более для сабжевой
> задачи это(отхавывание) абсолютно не нужно.


Только скорость отображения страниц на линейное пространство быстрее, чем подкачка из mapped файла . :)


 
oxffff ©   (2007-09-09 21:58) [103]


> Riply ©   (09.09.07 21:45) [100]


Неужели трудно прочитать первое предложение  из

oxffff ©   (09.09.07 20:06) [82].

Удивляться то чему?


 
MetalFan ©   (2007-09-09 22:05) [104]


> Только скорость отображения страниц на линейное пространство
> быстрее, чем подкачка из mapped файла . :)
>

ага, а исходная строка на >2Gb в памяти сама по себе возникнет?!


 
Riply ©   (2007-09-09 22:09) [105]

> [103] oxffff ©   (09.09.07 21:58)
>Неужели трудно прочитать первое предложение  из oxffff ©   (09.09.07 20:06) [82].
Прочтала. Чесно говоря не поняла.
Поясни.

>Удивляться то чему?
Тому что следующий код выдает сообщение: "189" вместо "123456789" :)
//выдернуто из контекста
a:="123456789";
ShowMessage(a);
//конец выдергивания

>Неподготовленный вынуждает компилятор сделать две копии.


 
Sha ©   (2007-09-09 22:09) [106]

> oxffff ©   (09.09.07 21:58) [103]
> Удивляться то чему?

Тому, о чем ты даже не подозреваешь )))


 
oxffff ©   (2007-09-09 22:10) [107]


> Riply ©   (09.09.07 21:45) [100]


Да и примеры строк из сегмента данных, да еще shared констант надуманны.
Я показал пример, как выкрытиться с блоком данных, если нет возможности выделить дополнительный рабочий блок.

Что касаемо использование /3gb, AWE и MMF, то не составляет написать небольшой класс обертку.

За сим откланиваюсь.


 
Sha ©   (2007-09-09 22:13) [108]

Любой нормальный программист ожидает, что после
a:="123456789"; ShowMessage(a);
он увидит на экране строку "123456789" а не "189".
Огромное спасибо тебе от него обеспечено.


 
oxffff ©   (2007-09-09 22:19) [109]


> Sha ©   (09.09.07 22:09) [106]
> > oxffff ©   (09.09.07 21:58) [103]
> > Удивляться то чему?
>
> Тому, о чем ты даже не подозреваешь )))


Я написал решение вашей проблемы в
oxffff ©   (09.09.07 20:06) [82].

А именно в вынуждении компиляторы избежать shared констант.


 
oxffff ©   (2007-09-09 22:21) [110]


> Sha ©   (09.09.07 22:13) [108]
> Любой нормальный программист ожидает, что после
> a:="123456789"; ShowMessage(a);
> он увидит на экране строку "123456789" а не "189".
> Огромное спасибо тебе от него обеспечено.


Читать [82].


 
oxffff ©   (2007-09-09 22:21) [111]

procedure TForm1.Button1Click(Sender: TObject);
const
   a1:string="123456789";
   a2:string="123456789";
begin
FastDel(a1,2,3);  ShowMessage(a1);
FastDel(a2,2,3);  ShowMessage(a2);
ShowMessage(a1);
end;


 
oxffff ©   (2007-09-09 22:24) [112]


> MetalFan ©   (09.09.07 22:05) [104]
>
> > Только скорость отображения страниц на линейное пространство
>
> > быстрее, чем подкачка из mapped файла . :)
> >
>
> ага, а исходная строка на >2Gb в памяти сама по себе возникнет?
> !


Мыслите шире. Это может быть блок сгенерированный run time.


 
Sha ©   (2007-09-09 22:29) [113]

> oxffff ©   (09.09.07 22:21) [110]
> oxffff ©   (09.09.07 22:21) [110]

Ты это серьезно?

По-моему, так объяленная функция
function FastDel(const A:string;Pos,Count:integer):boolean;
обязана допускать такое использование
FastDel(a,2,3);  ShowMessage(a);
FastDel(a,2,3);  ShowMessage(a);


Если ты считаешь иначе, то у меня нет слов...


 
oxffff ©   (2007-09-09 22:36) [114]


> Sha ©   (09.09.07 22:29) [113]
> > oxffff ©   (09.09.07 22:21) [110]
> > oxffff ©   (09.09.07 22:21) [110]
>
> Ты это серьезно?
>
> По-моему, так объяленная функция
> function FastDel(const A:string;Pos,Count:integer):boolean;
>
> обязана допускать такое использование
> FastDel(a,2,3);  ShowMessage(a);
> FastDel(a,2,3);  ShowMessage(a);
>
> Если ты считаешь иначе, то у меня нет слов...


Очень жаль.

Я собственно считаю, что если человек как профессионал разбирается в тонкостях работы, что написание оптимизированной процедуры  с потерей гибкости, это проявление компромиса, а значит ума.


 
Sha ©   (2007-09-09 22:47) [115]

Ну, например, процедура [62] ничуть не хуже, но без заложенных бомб.
И чтоб ее испьзовать, не надо быть "профессионалом".

А про кривизну в своем коде со временем забудешь - и бомба сработает.
Нужен ли такой "профессионализм"?


 
oxffff ©   (2007-09-09 22:57) [116]

Ваш код не работает.

Грабли первые

procedure TForm1.Button1Click(Sender: TObject);
var  b,c:string;
begin
c:="dsads";
DeleteString(c,"ad");
showmessage(c);
end;

ловите AV.


 
oxffff ©   (2007-09-09 22:58) [117]

Сейчас еще один недостаток проверю и найду.
Напросились сами.


 
oxffff ©   (2007-09-09 23:05) [118]

Второй недостаток не подтвердился.
SysReallocMem позволяет сделать ResizeInPlace.

Ладно так что исправляйте первый. ;)


 
oxffff ©   (2007-09-09 23:10) [119]

Добавьте

VirtualProtect(pointer(s),length(s),PAGE_EXECUTE_READWRITE,Old);

И проверьте свой же контр пример

procedure TForm1.Button1Click(Sender: TObject);
var  b,c:string;
begin
c:="123456789";
DeleteString(c,"34");
showmessage(c);
c:="123456789";
DeleteString(c,"34");
showmessage(c);
end;

Так что руки у нас с вами из одного и того же места растут. LOL. :)


 
Sha ©   (2007-09-09 23:17) [120]

>  oxffff ©   (09.09.07 22:57) [116] - [119]

Конечно, надо вставить вызов
  UniqueString(s);
перед оператором
 q:=pointer(s); //чтобы компилятор не вставлял вызовы UniqueString
раз уж мы все делаем сами.

Спасибо за найденную неточность :)


 
oxffff ©   (2007-09-09 23:26) [121]


> Sha ©   (09.09.07 23:17) [120]
> >  oxffff ©   (09.09.07 22:57) [116] - [119]
>
> Конечно, надо вставить вызов
>   UniqueString(s);
> перед оператором
>  q:=pointer(s); //чтобы компилятор не вставлял вызовы UniqueString
> раз уж мы все делаем сами.
>
> Спасибо за найденную неточность :)


Эх профессиональный вы наш. :)

UniqueString(s) - создаст копию строки, если сможет.
Не забываем об оптимизации.

Две огромных строки - это не компромис.

Предлагаю оптимизировать ваш проверять RefCount на -1 и тогда делать
UniqueString.


 
oxffff ©   (2007-09-09 23:30) [122]


> oxffff ©   (09.09.07 23:26) [121]


Ошибочка вышла UniqueString(s) этим и занимается.


 
Sha ©   (2007-09-09 23:37) [123]

> oxffff ©   (09.09.07 23:26) [121]

> Эх профессиональный вы наш. :)
Профессионал может забыть, что-сделать,
а ламера надо заставлять это делать.
Почувствовал разницу?

> UniqueString(s) - создаст копию строки, если сможет.
> Не забываем об оптимизации.
> Две огромных строки - это не компромис.

UnicueString создат копию только в случае RO-строки или неуникальной,
т.е. как раз в том случае, как нам и надо.
Это описано в хелпе, не поленись - прочитай.

> Предлагаю оптимизировать ваш проверять RefCount на -1 и тогда делать
UniqueString.
Все сделано уже до нас в коде UniqueString. :)


 
oxffff ©   (2007-09-09 23:44) [124]


> Sha ©   (09.09.07 23:37) [123]
> > oxffff ©   (09.09.07 23:26) [121]
>
> > Эх профессиональный вы наш. :)
> Профессионал может забыть, что-сделать,
> а ламера надо заставлять это делать.
> Почувствовал разницу?


Ну вы и жук.
Не красиво себя так вести.

Не надо выкручиваться. [62] не предусматривал работы с конст строками

Увы. Сами себя выдали.

Доказательство комментарий

q:=pointer(s); //чтобы компилятор не вставлял вызовы UniqueString

Так что руки растут от туда же.


> Это описано в хелпе, не поленись - прочитай.


oxffff ©   (09.09.07 23:30) [122]

Далее по тексту. Про оптимизацию забыли?
Мы работаем с большой строкой, так что ваш вариант - увы не может удовлетворить.


 
oxffff ©   (2007-09-09 23:47) [125]

Что касаемо хелпа.
Я его читаю, но в нем (UniqueString help) не сказано про строки константы.
Тогда мне помогает отладчик.


 
oxffff ©   (2007-09-09 23:56) [126]


> Sha ©   (09.09.07 23:37) [123]
> > oxffff ©   (09.09.07 23:26) [121]
>
> > Эх профессиональный вы наш. :)
> Профессионал может забыть, что-сделать,
> а ламера надо заставлять это делать.
> Почувствовал разницу?


Я то почуствовал. Что так называемый профессионал пытался что то доказать, хотя обделался на том же самом и  ему как профессионалу (а уж тем более МАСТЕРУ DELPHI), НЕЛЬЗЯ забывать что-то сделать, ибо тогда он не ПРОФЕССИОНАЛ (хотя не мне судить). Так что извольте погончики свои снять и сдать обратно.


 
Sha ©   (2007-09-09 23:58) [127]

> oxffff ©   (09.09.07 23:44) [124]

>>> Эх профессиональный вы наш. :)
>> Профессионал может забыть, что-сделать,
>> а ламера надо заставлять это делать.
>> Почувствовал разницу?
> Ну вы и жук.
> Не красиво себя так вести.

А чем, по-твоему, отличается профессионал от ламера?

> Не надо выкручиваться. [62] не предусматривал работы с конст строками
> Доказательство комментарий
> q:=pointer(s); //чтобы компилятор не вставлял вызовы UniqueString

В инете дофига моего кода, работающего со строками, и везде
перед  
 q:=pointer(s); //чтобы компилятор не вставлял вызовы UniqueString
стоит
 UniqueString(s);

> Так что руки растут от туда же.

Вот это некрасиво - который раз уже

> Далее по тексту. Про оптимизацию забыли?
> Мы работаем с большой строкой, так что ваш вариант - увы не может удовлетворить.

Почему?
Разве он использует дополнительную память?
Или делает лишние операции?


 
oxffff ©   (2007-09-10 00:02) [128]

to Sha

Я нигде не указал, что мой пример пригоден для всего.
Когда его привел, я исходил из оптимизации.
И до последнего отстаивал его по причине не возможности выделить дополнительный блок памяти.


 
oxffff ©   (2007-09-10 00:04) [129]


> Почему?
> Разве он использует дополнительную память?
> Или делает лишние операции?


А что нет? Читайте help

Для конст строки будет создан дублекат.


 
oxffff ©   (2007-09-10 00:06) [130]


> Вот это некрасиво - который раз уже


Не удачно выразился.
ПОД этим понимайте, что вы и я написали код, который не обрабатывает определенного вида ситуации. А не то о чем вы подумали. :)


 
oxffff ©   (2007-09-10 00:08) [131]


> А что нет? Читайте help


help кстати молчит по этому поводу. Только отладчик позволит выяснить истинное поведение

       MOV     ECX,[EDX-skew].StrRec.refCnt
       DEC     ECX
       JE      @@exit


 
Sha ©   (2007-09-10 00:09) [132]

> oxffff ©   (10.09.07 00:04) [129]
> Для конст строки будет создан дублекат.

В нашем случае это необходимо, иначе процедура будет неработоспособна.


 
Sha ©   (2007-09-10 00:11) [133]

> oxffff ©   (10.09.07 00:06) [130]
> Не удачно выразился.

Извинения приняты.
Впредь потрудись подбирать слова.


 
oxffff ©   (2007-09-10 00:12) [134]

Я надеюсь мы наконец поняли друг друга.

И уверен сохраним самое главное - уважение друг другу.


 
oxffff ©   (2007-09-10 00:23) [135]


> Sha ©   (10.09.07 00:09) [132]
> > oxffff ©   (10.09.07 00:04) [129]
> > Для конст строки будет создан дублекат.
>
> В нашем случае это необходимо, иначе процедура будет неработоспособна.
>


Поэтому ваши замечания к моему коду и мои требования к вызову
virtualProtect и explicit constants(do not use shared const) исходили из
oxffff ©   [128]


 
Sha ©   (2007-09-10 00:28) [136]

> oxffff ©   (10.09.07 00:23) [135]

Не надо опасаться, что код создает уникальную копию константной строки.
Такие строки большими не бывают.



Страницы: 1 2 3 4 вся ветка

Текущий архив: 2007.10.07;
Скачать: CL | DM;

Наверх




Память: 0.85 MB
Время: 0.035 c
15-1189424595
MZ
2007-09-10 15:43
2007.10.07
Управление пользователями FireBird


2-1189500997
RomanH
2007-09-11 12:56
2007.10.07
Бвстрая замена символа на символ


2-1189391632
арпывапр
2007-09-10 06:33
2007.10.07
отключение USB?


15-1188973346
de.
2007-09-05 10:22
2007.10.07
Город мастеров (Полу сабж, полу вопрос... :)


15-1189138046
SerJaNT
2007-09-07 08:07
2007.10.07
Вопрос по HTML





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский