繁体   English   中英

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

[英]Delphi: array of Char and TCharArray “Incompatible Types”

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

这实际上可能是编译器错误(或从未正确记录的限制)。 我做了一些实验,发现你可以将一个动态数组(无论是否打字)传递给一个期望几乎所有类型的开放数组的过程......除了Char和WideChar。

当参数类型是Char的打开数组时,请参阅是否允许动态Char数组? 有关问题的描述和可能的解决方法。

键入的@运算符关闭时,编译器不会检查您为指针分配的内容,因此您可以使用错误的参数调用过程:

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的回答的评论中表明,这是行不通的。

然后,您可以尝试声明与具有开放数组参数的假过程兼容的假过程:

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.

Rudy的优秀文章归功于Rudy。 以及相关文档(来自Program Control ):

open-array参数作为两个32位值传递。 第一个值是指向数组数据的指针,第二个值是小于数组中元素数量的值。

你没有。 Pascal按名称处理数组类型,而不是按描述处理数组类型,并且始终具有。 你为什么不能改变DoArray的声明? (为什么它首先写得那样?)

我没有看到提到的一点是TCharArray是动态数组类型,而在

procedure DoArray(Chars: array of Char); 

Chars是一个开放数组参数。 声明动态数组参数没有语法。 要拥有动态数组参数,需要将其声明为类型。

type
  TMyDynArray = array of Integer;

procedure DoArray(Integers : TMyDynArray);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM