Вы можете работать с этим видом массива, определяя свой собственный тип:
type
TCharDynArray = array of char;
procedure Clear(AArray: TCharDynArray);
var
I: Integer;
begin
for I := Low(AArray) to High(AArray) do
AArray[I] := #0;
end;
procedure test;
var
MyArray: TCharDynArray;
begin
Clear(MyArray);
end;
Этот код прекрасно скомпилируется.Конечно, он не делает ничего полезного (параметр AArray не установлен как «var», поэтому он копируется в стек перед назначением # 0 для каждого элемента).Но, по крайней мере, он компилируется.
На практике я обнаружил, что более просто определить или использовать высокоуровневые типы для динамических массивов (например, TIntegerDynArray), потому что, по крайней мере, он позволяет передавать массив как ссылку, используя var, поэтому избегая создания копии в стеке и ускоряя ваш код.
Что касается отображения в PChar, это обычно для всех динамических массивов: вы можете отобразить TIntegerDynArray на указатель, затемиспользуйте его как PInteger или PIntegerArray:
procedure AddInteger(var Values: TIntegerDynArray; Value: integer);
var n: integer;
begin
n := Length(Values);
SetLength(Values,n+1);
Values[n] := Value;
end;
procedure Loop(V: PInteger);
begin
if V<>nil then
while V^<>0 do begin
write(V^,' ');
inc(V); // go to next integer in array
end;
end;
var IntArray: TIntegerDynArray;
begin
Loop(pointer(IntArray)); // will display nothing, since pointer(IntArray)=nil for IntArray=[]
AddInteger(IntArray,2);
AddInteger(IntArray,3);
AddInteger(IntArray,0);
Loop(pointer(IntArray)); // will display '2 3 '
end.
Проблема заключается в том, что код «массив символов» несовместим с «массивом целых чисел», что, безусловно, присуще компилятору, и тот факт, что PChar может бытьприведение типа к строке.