我在下面的评论中遇到过这种“不兼容类型”错误几次,并且从未对Delphi 2007中没有直接支持的原因感到满意:
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;
begin
DoArray(ReturnTCharArray); // [DCC Error] Project1.dpr(18): E2010 Incompatible types: 'Array' and 'TCharArray'
end.
是否应该可以将数组类型“别名”化为另一个彼此兼容的数组类型?假设我无法更改DoArray的声明(它是第三方库的一部分),我如何编写一个返回与DoArray的param兼容的char数组的函数?直截了当的“函数ReturnAChar:Char数组;”导致“标识符预期但发现'ARRAY'”错误。我甚至尝试将返回数组的函数更改为带有var“array of char”pram的过程,但是这也不允许在过程中设置“Char数组”参数的长度(“Constant对象不能传递作为var参数“)。
答案 0 :(得分:5)
这可能实际上是编译器错误(或从未正确记录的限制)。我做了一些实验,发现你可以将一个动态数组(无论是否打字)传递给一个期望几乎所有类型的开放数组的过程......除了Char和WideChar。
有关问题的说明和可能的解决方法,请参阅Is a dynamic array of Char allowed when the parameter type is open array of Char?。
答案 1 :(得分:4)
当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”在他对Mason's answer的评论中指出的原因,这不起作用。
然后,您可以尝试声明与具有开放数组参数的假过程兼容的假过程:
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.
他的great article应归功于Rudy。以及相关文档(来自Program Control):
传递一个open-array参数 两个32位值。第一个值是 一个指向数组数据的指针,以及 第二个值比一个小 数组中的元素数量。
答案 2 :(得分:2)
你没有。 Pascal按名称处理数组类型,而不是按描述处理数组类型,并且始终具有。你为什么不能改变DoArray的声明? (为什么它首先写得那样?)
答案 3 :(得分:-1)
我没有看到提到的一点是TCharArray是动态数组类型,而在
procedure DoArray(Chars: array of Char);
Chars是一个开放数组参数。声明动态数组参数没有语法。要获得动态数组参数,需要将其声明为类型。
type
TMyDynArray = array of Integer;
procedure DoArray(Integers : TMyDynArray);