gpt4 book ai didi

delphi - 动态数组长度的32位和64位不同类型?

转载 作者:行者123 更新时间:2023-12-03 15:20:57 28 4
gpt4 key购买 nike

我有一个在 Win32 上运行良好的 DUnitX 测试套件。但是当我尝试为 Win64 编译它时,此行会产生编译错误:

Assert.AreEqual(4, Length(r.Values));

[dcc64 错误] ...: E2532 无法从方法“AreEqual”的不同参数类型推断泛型类型参数

r.Values 定义为:

Type TIntegers = TArray<Integer>

Assert.AreEqual 有不同的重载实现,而 dcc64 无法选择正确的实现...好吧,但是为什么呢?为什么 dcc32 可以毫无问题地编译它?

我唯一的线索是,如果我将鼠标悬停,Delphi 会告诉我 Length 的类型为 System.Smallint。没有带有 Smallint 参数的 Assert.AreEqual 实现...果然,如果我将其转换为 Integer,dcc64 将编译它。

但这让我很烦恼。如果我查看 System.pas 单元,我可以看到 DynArraySetLength 采用 NativeInt 参数...一个 64 位整数(我期望无符号,但不确定)。那么为什么 Length 应该返回一个 16 位有符号整数呢?这似乎是等待发生的麻烦,对吧?

我错过了什么?

最佳答案

在 64 位中,TArray 的长度类型为 Int64 。据我所知,没有 AreEqual Int64 过载,因此它尝试使用通用版本:AreEqual<> 。但从参数来看,似乎无法决定是哪一个。

所以在 Win64 中,执行以下操作:

 Assert.AreEqual<Int64>(4, Length(r.Values));

 Assert.AreEqual(4, Integer(Length(r.Values)));

后者当然是最简单的,因为它应该可以在 Win32 和 Win64 中工作,但可能无法处理非常大的数组。

<小时/>

FWIW,Length不返回Smallint 。但对于平台之间不同的函数,尤其是“编译器魔法”函数,如 Length ,这样的(错误的)信息可能会发生。这是 IDE 的问题,而不是编译器的问题。

更新:

正如 @RemyLebeau 所说,使用 NativeInt 可能更容易反而。这应该适用于 Win32 和 Win64,如 NativeIntInt32在 Win32 和 Int64 中在Win64中,这也是_DynArrayLength返回:

Assert.AreEqual<NativeInt>(4, Length(r.Values));

关于delphi - 动态数组长度的32位和64位不同类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45456395/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com