-
> хочу переписать Ваш код чисто на виньапишках.
А что это даст? Какие преимущества?
-
> DVM © (27.04.13 21:14) [20]
телепатор подсказывает мне, что непрерывное расширение буфера последовательными вызовами SetLength забивает память дельфового менеджера кучи пустыми блоками, и программа падает с Out of memory. Вариант решения — хранить принятые данные фрагментами в односвязном списке, например.
-
> RWolf © (27.04.13 22:15) [21]
Хм, очень интересная подача :) Но как? При расширении буфера выйдем на реаллок, фрагментация то откуда? :)
-
> Rouse_ © (27.04.13 23:11) [22]
я хочу сказать, что в [0] мы видим не весь код, так что, возможно, реализуется ситуация наподобие такой: procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
s:string;
a:array of string;
begin
for i:=1 to 100 do begin SetLength(s, 100000000 + 4*i);
SetLength(a, Length(a)+1);
a[High(a)]:=IntToStr(i);
end;
end;
-
> При расширении буфера выйдем на реаллок, фрагментация то > откуда?
А есть ли в задаче автора возможность > Но выделить нужно сразу столько, сколько потребуется ? Иначе использование флага HEAP_REALLOC_IN_PLACE_ONLY просто вызовет ошибку. А тогда фрагментации избежать не удастся ровно также как и при использовании SetLength.
P.S. Меня больше смущает ответ автора:
> с этим всё понятно, а вот полез в > procedure _LStrSetLength{ var str: AnsiString; newLength: > Integer}; >
|