Вам нужно использовать регулярное выражение?
return new String(input.Where(Char.IsDigit).ToArray());
Ответ ясен из процедуры System.DynArraySetLength, из строки 20628:
Inc(neededSize, Sizeof(Longint)*2);
if neededSize < 0 then
Error(reRangeError);
Максимальное значение, которое вы можете выделить, не вызывая ошибки проверки диапазона, теоретически составляет Maxint - SizeOf (Longint) * 2 На практике вы получите ошибку нехватки памяти в зависимости от того, сколько памяти доступно.
Нет смысла строить предположения о максимальной теоретической длине динамического массива, поскольку максимальная практическая длина намного меньше.
Размер структуры данных и содержащихся в ней данных имеет быть меньше, чем максимальная память, которую может выделить приложение, за вычетом памяти, необходимой для самого кода приложения, стека и других данных. В Windows (32-разрядная версия, единственная версия, которую мы, простые смертные, можем нацелить на Delphi прямо сейчас), это диапазон виртуальных адресов размером 2 ГБ или 3 ГБ со специальным переключателем для загрузчика ОС для каждого приложения. Однако я не уверен, что приложение Delphi может даже обрабатывать пространство памяти 3 ГБ, поскольку последняя треть будет иметь отрицательные значения для смещений во всех местах, где используются целые числа вместо LongWords.
Таким образом, вы можете попытаться выделить динамический массив, скажем, 80% или 90% от MaxInt div SizeOf (элемент массива)
- с наиболее вероятным результатом, что выделение этого блока памяти не удастся во время выполнения.
Также: указание длины int64 и отсутствие исключения не означает, что массив имеет заданную длину. Рассмотрим этот код:
procedure TForm1.Button1Click(Sender: TObject);
var
a: array of byte;
l: int64;
begin
l := $4000000000;
SetLength(a, l);
Caption := IntToStr(Length(a));
end;
Если проверка диапазона отключена, он будет компилироваться без подсказок и предупреждений и выполняться без исключений. Только небольшая проблема заключается в том, что после вызова SetLength () массив имеет длину 0. Поэтому для проверок в вашем вопросе вы обязательно должны прочитать длину динамического массива после успешного SetLength () , это единственный способ убедиться, что компилятор и среда выполнения сделали то, что вы планировали.
указание длины int64 и отсутствие исключения не означает, что массив имеет заданную длину. Рассмотрим этот код:procedure TForm1.Button1Click(Sender: TObject);
var
a: array of byte;
l: int64;
begin
l := $4000000000;
SetLength(a, l);
Caption := IntToStr(Length(a));
end;
Если проверка диапазона отключена, он будет компилироваться без подсказок и предупреждений и выполняться без исключений. Только небольшая проблема заключается в том, что после вызова SetLength () массив имеет длину 0. Поэтому для проверок в вашем вопросе вы обязательно должны прочитать длину динамического массива после успешного SetLength () , это единственный способ убедиться, что компилятор и среда выполнения сделали то, что вы планировали.
указание длины int64 и отсутствие исключения не означает, что массив имеет заданную длину. Рассмотрим этот код:procedure TForm1.Button1Click(Sender: TObject);
var
a: array of byte;
l: int64;
begin
l := $4000000000;
SetLength(a, l);
Caption := IntToStr(Length(a));
end;
Если проверка диапазона отключена, он будет компилироваться без подсказок и предупреждений и выполняться без исключений. Только небольшая проблема заключается в том, что после вызова SetLength () массив имеет длину 0. Поэтому для проверок в вашем вопросе вы обязательно должны прочитать длину динамического массива после успешного SetLength () , это единственный способ убедиться, что компилятор и среда выполнения сделали то, что вы планировали.
Только небольшая проблема заключается в том, что после вызова SetLength () массив имеет длину 0. Поэтому для проверок в вашем вопросе вы обязательно должны прочитать длину динамического массива после успешного SetLength () , это единственный способ убедиться, что компилятор и среда выполнения сделали то, что вы планировали. Только небольшая проблема заключается в том, что после вызова SetLength () массив имеет длину 0. Поэтому для проверок в вашем вопросе вы обязательно должны прочитать длину динамического массива после успешного SetLength () , это единственный способ убедиться, что компилятор и среда выполнения сделали то, что вы планировали.Обратите внимание, что количество элементов afaik также ограничено, более 2 ^ 31-1 маловероятно. Возможно, размер имеет такой же предел (чтобы избежать проблем со знаком <> без знака в RTL). Я сомневаюсь, что даже в режиме / 3 ГБ возможно более 2 ГБ.