gpt4 book ai didi

Delphi数据类型太大: exceeds 2 GB in Berlin Update 2

转载 作者:行者123 更新时间:2023-12-03 14:43:45 26 4
gpt4 key购买 nike

我有一个适用于 Delphi 和 Lazarus 的装置。在 Lazarus 中,该单元编译时没有任何异常,但在 Delphi 中,它给我错误数据类型太大:超过 2 GB。下面是代码:

unit UType;

{$ifdef FPC}
{$MODE delphi}{$H+}
{$endif}

interface


type
TFreqType = Extended;

TFreqCutArray = Array [0..0]of TFreqType;

PFreqCutArray = ^TFreqCutArray;

FilterOrder = Integer;

TAS_Sample = Extended;

TAS_SampleArray = Array[0..High(Integer) div Sizeof(TAS_Sample) - 1] of TAS_Sample;

PTAS_SampleArray = ^TAS_SampleArray;

TAS_Float = Extended;

TComplex = record
Re, Im: TAS_Sample; // Z = Re + i*Im
end;

PComplex = ^TComplex;
TComplexArray = Array[0..High(Integer) div Sizeof(TComplex) - 1] of TComplex;//here Delphi gives the error

PComplexArray = ^TComplexArray;
FilterProc = function(V: TAS_Sample): TAS_Sample of object;

implementation

end.

我正在使用 Berlin Update 2,在 Lazarus 中使用相同的代码,它编译时没有任何错误。

最佳答案

这似乎是一个编译器缺陷。您可以这样声明类型:

TComplexArray = Array[0..67108862] of TComplex;

并且编译器将接受该声明。请注意,67108862 = High(Integer) div Sizeof(TComplex) - 1

您可以通过声明常量来避免对上限进行硬编码:

const
ComplexArrayUpperBound = High(Integer) div Sizeof(TComplex) - 1;

type
TComplexArray = Array[0..ComplexArrayUpperBound] of TComplex;
<小时/>

这种类型声明风格如今已经非常过时了。我强烈建议您使用动态数组。这些将使您自动清理动态内存,并允许编译器为所有数组访问添加范围检查代码。后一点很重要,因为它会提前警告您代码中的边界错误。

如果您不分配数组而是声明这些类型以启用数组索引,那么使用 {$POINTERMATH ON} 可能更简单.

此外,我建议您使用Double 而不是Extended。您不太可能需要 10 字节 Extended 类型,切换到 Double 将使您的内存需求减半。由于对齐,您的 TComplex 大小为 32 字节,但基于 Double 的版本将为 16 字节。由于更好地利用缓存,这种节省将带来显着的性能优势。

关于Delphi数据类型太大: exceeds 2 GB in Berlin Update 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43200713/

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