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

delphi – 动态数组长度的32位和64位不同类型?,第1张

概述我有一个在Win32上正常运行的DUnitX测试套件.但是当我尝试为Win64编译它时,这一行会产生编译错误: Assert.AreEqual(4, Length(r.Values)); [dcc64错误] …:E2532无法从方法’AreEqual’的不同参数类型推断泛型类型参数 r.Values定义为: Type TIntegers = TArray<Integer> Assert.AreEq 我有一个在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.据我所知,Int64没有AreEqual重载,因此它尝试使用通用版本:AreEqual<&gt ;.但看起来,从参数来看,它无法决定哪一个. 所以在Win64中,做:

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

要么

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

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

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

更新:

正如@RemyLebeau所说,使用NativeInt可能更容易.这应该适用于Win32和Win64,因为NativeInt是Win32中的Int32和Win64中的Int64,它也是_DynArrayLength返回的内容:

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

以上是内存溢出为你收集整理的delphi – 动态数组长度的32位和64位不同类型?全部内容,希望文章能够帮你解决delphi – 动态数组长度的32位和64位不同类型?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1268109.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存