код такой:
- Код: Выделить всё
- 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 секунд:
правильный ответ это избавиться от рекурсии и использовать цикл



