Когда typed @ operator выключен, компилятор не проверяет, что вы назначаете указателю, поэтому вы можете вызвать процедуру с неправильными параметрами:
program Project1; {$APPTYPE CONSOLE}
type TCharArray = array of Char;
procedure DoArray(Chars: array of Char);
begin
end;
function ReturnTCharArray: TCharArray;
var CharArray: TCharArray;
begin
Result := CharArray;
end;
type TFakeDoArray = procedure(Chars: TCharArray);
var
FakeDoArray: TFakeDoArray;
begin
FakeDoArray := @DoArray;
FakeDoArray(ReturnTCharArray);
end.
Хотя компилятор не будет жаловаться, по той же причине, что 'Jeroen' указывает в своем комментарии на ответ Мейсона , это не будет работать.
Затем вы можете попытаться объявить вашу поддельную процедуру совместимой с процедурой с параметром открытого массива:
program Project1; {$APPTYPE CONSOLE}
type TCharArray = array of Char;
procedure DoArray(Chars: array of Char);
begin
end;
function ReturnTCharArray: TCharArray;
var CharArray: TCharArray;
begin
Result := CharArray;
end;
type
TFakeDoArray = procedure(AnArray: Pointer; High: Integer);
var
FakeDoArray: TFakeDoArray;
Tmp: TCharArray;
begin
FakeDoArray := @DoArray;
Tmp := ReturnTCharArray;
FakeDoArray(Tmp, High(Tmp));
end.
Кредиты причитаются Руди за его замечательную статью . И соответствующая документация (от Управление программой ):
Параметр открытого массива передается как
два 32-битных значения. Первое значение
указатель на данные массива и
второе значение на единицу меньше
количество элементов в массиве.