Delphi:Char和TCharArray数组“不兼容的类型”

时间:2010-09-23 16:00:03

标签: arrays delphi types char

我在下面的评论中遇到过这种“不兼容类型”错误几次,并且从未对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参数“)。

4 个答案:

答案 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);