在Delphi中定义其他单元的类型

时间:2009-04-03 20:17:58

标签: delphi types parameters definition delphi-units

Var
     A : Array [1..4] of Integer;
     B : Array [1..4] of Integer;

Begin
    A := B;

无法正常工作,因为loren-pechtel说here 问题是A和B对我来说是不同的单位。那么,有没有办法从另一个类中的现有类型定义类型定义?

8 个答案:

答案 0 :(得分:13)

在某个单元的接口块中定义类型,然后在需要该类型的其他单元中通过uses子句包含该单元。

unit A;
interface
type
  TMyArray = array [1..4] of Integer;

...

当您需要在另一个单元中使用TMyArray时:

unit B;
interface
uses A;

...
var x : TMyArray;

答案 1 :(得分:5)

或者,在单元C的接口部分定义您的类型,并在A和B中使用此单元。

答案 2 :(得分:1)

Delphi中的数组类型有点奇怪。 看起来就像A和B的类型完全相同,但Delphi并不认为它们是相同的。 “整数的数组[1..4]”出现两次,因此德尔福认为有两种不同的类型。这只是德尔福的一个奇怪之处。我认为大多数其他语言都不会关心。这在实践中不是问题;这有点奇怪。也许这是有充分理由的。谁知道。正如其他人所说,解决方案是定义您自己的类型,您可以将其放入可供其他单位使用的单元中。我刚才提到这个数组类型的问题,因为它可能让你感到困惑。

答案 3 :(得分:1)

另一种方法,有点旧学但仍然有效,是使用ABSOLUTE关键字强制一个的内存覆盖另一个,并使另一个类型兼容。例如,在单位a中,假设您有以下内容:

TYPE
  TArrayA = Array[1..4] of integer;

然后在单元b中,您有以下内容:

TYPE
  TArrayB = Array[1..4] of integer;  

为了兼容性,您可以执行以下操作:

VAR
  InstanceA : TArrayA;
  InstanceB : TArrayB;
  InstanceBasA : TArrayA ABSOLUTE InstanceB;

这样做是创建一个ArrayA类型的变量“InstanceBasA”,它与变量“InstanceB”覆盖相同的内存空间。这允许您执行以下命令:

InstanceA := InstanceBasA;

答案 4 :(得分:0)

将数据从variablea移动到variableb的另一种方法是使用MOVE命令。例如,要从ArrayA移动到ArrayB,您可以执行以下操作:

var
  ArrayA : array[1..4] of Integer;
  ArrayB : Array[1..4] of Integer;
begin
  FillChar(ArrayB[1],SizeOf(ArrayB),#0);
  ArrayA[1] := 1234;
  ArrayA[2] := 3456;
  ArrayA[3] := 7890;
  ArrayA[4] := 9876;

  // This is where the move from ArrayA to ArrayB happens.
  Move( ArrayA[1], ArrayB[1], SizeOf(ArrayA) );

  Assert( ArrayA[4] = ArrayB[4], 'ArrayA[4] <> ArrayB[4]');
end;

这是因为数组是以线性方式布局的,所以你从第一个数组位置开始复制字节,为数组的长度。

答案 5 :(得分:0)

您可以强制编译器通过类型转换来假设它们属于同一类型:

type
  TIntArray = array[1..4] of integer;

begin
  Assert(SizeOf(ArrayA) = SizeOf(TIntArray));
  Assert(SizeOf(ArrayB) = SizeOf(TIntArray));
  TIntArray(ArrayA) := TIntArray(ArrayB);

但是你应该确保两者实际上都是数组[1..4],否则你将覆盖一些内存。这就是我添加两个断言的原因。

答案 6 :(得分:0)

只需在界面之后和实施之前使用Unit中的UnitS ...... !!!!

答案 7 :(得分:0)

从不,永远不要使用这样的代码:

// This is where the move from ArrayA to ArrayB happens.
Move( ArrayA[1], ArrayB[1], SizeOf(ArrayA) );

缺陷在哪里?您正在使用SOURCE大小来获取要移动的字节数,而不是DESTINATION大小!如果SizeOf(A)&gt; SizeOf(B)你有缓冲区溢出而你正在覆盖内存。如果你运气好的话,你会得到一个AV,如果你不是你有一个可利用的漏洞。总是使用目标大小要好得多,虽然这样你最终可以读取内存,如果大小(B)&gt;大小(A),可能会暴露不需要的数据。 无论如何,在移动数据时总是检查结构边界 - 一些公司从他们的代码中禁止这样的操作(即memcpy())。