код такой:
- Код: Выделить всё
var d :Tstrings; var i:integer; //глобальные переменные
function intToBin(Value: Longint; Digits:integer): string;
var i:integer;
begin
result:='';
if digits<=0 then exit;
for i:=0 to Digits-1 do
if Value and(1 shl i)>0 then
result:='1'+result
else result:='0'+result
end;
procedure recurs;
begin
d.Append('строка № - '+inttobin(i,15)+'|'+inttostr(i)+'|');
inc(i);
if i>=100000 then exit;
recurs;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
d:=Tstringlist.Create;
{ i:=1;
recurs;}
for i:=1 to 1000000 do
begin
d.Append('строка № - '+inttobin(i,15)+'|'+inttostr(i)+'|');
end;
d.SaveToFile('s');
d.Free;
end;
через рекурсивную процедуру recurs код отрабатывает на i=100000 а на 200 000 уже переполнение стека
а через цикл for работает и на 1 000 000, на 10млн памяти нехватило.(на дельфи 10 млн отработало файл сформировался на ~ 368 мб довольно быстро)
вопрос в том как изменить процедуру recurs; чтобы не было переполнения стека?.
P.S. приведеный код это имитация (тестовый стенд) проблемы возникшей у меня. я читаю файл размер 5 мб. в ASN.1 кодировке, он содержит более ~200 000 тегов. которые нужно определить, определить их длину, декодировать данные. делается это с помощью рекурсивной функции. на объемах до 2 мб работает всё хорошо. а более переполняется стек.
результаты хранятся в глобальный переменной типа TSTRINGS
Добавлено спустя 2 часа 35 минут 30 секунд:
наверно правильный ответ это избавиться от рекурсии
Добавлено спустя 29 минут 6 секунд:
правильный ответ это избавиться от рекурсии и использовать цикл