Var
A : Array [1..4] of Integer;
B : Array [1..4] of Integer;
Begin
A := B;
无法正常工作,因为loren-pechtel说here 问题是A和B对我来说是不同的单位。那么,有没有办法从另一个类中的现有类型定义类型定义?
答案 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())。