编译失败并显示以下 F6 声明:

type F3 is delta 2.0**(-4) range 0.0 .. ((2.0**8)-1.0)*2.0**(-4);    -- byte  16#f.f#;
for f3'size use 8;

type F4 is delta 2.0**(-8) range 0.0 .. ((2.0**16)-1.0)*2.0**(-8);   -- word 16#ff.ff#
for f4'size use 16;

type F5 is delta 2.0**(-16) range 0.0 .. ((2.0**32)-1.0)*2.0**(-16); -- dword 16#ffff.ffff#
for f5'size use 32;

type F6 is delta 2.0**(-32) range 0.0 .. ((2.0**64)-1.0)*2.0**(-32); -- ldword 16#ffff_ffff.ffff_ffff#
for f6'size use 32;

在 linux64/v8.0.3 和 learn.adacore.com 上同样失败。

编辑错误消息是“类型“f6”所需的大小 (65) 太大,允许的最大值为 64”

编辑添加'尺寸说明/预期的十六进制上限

编辑下面添加的固定类型卡住跟踪
loval -16#0.FF#E1, hival 16#0.FF#E1, Actual_Size  9
loval 0.0, hival 16#0.FF#E1, Actual_Size  8

loval -16#0.FFFF#E2, hival 16#0.FFFF#E2, Actual_Size  17
loval 0.0, hival 16#0.FFFF#E2, Actual_Size  16

loval -16#0.FFFF_FFFF#E4, hival 16#0.FFFF_FFFF#E4, Actual_Size  33
loval 0.0, hival 16#0.FFFF_FFFF#E4, Actual_Size  32

loval -16#0.FFFF_FFFF_FFFF_FFFF#E8, hival 16#0.FFFF_FFFF_FFFF_FFFF#E8, Actual_Size  64
loval 0.0, hival 16#0.FFFF_FFFF_FFFF_FFFF#E8, Actual_Size  63

最佳答案

基本问题是您的 GNAT 不支持大小超过 64 位的定点类型,如错误消息所述。而 F6 似乎需要 65 位。发生这种情况是因为对于定点类型, reference manual states :



这意味着 F6 类型的基本范围也包括对称负数,因此需要一个符号位。这就是为什么基本范围的表示需要 65 位而不是您期望的 64 位。

现在手册还指出



所以 F6 是需要 65 位的基本类型的子类型。由于 F6 的范围限制,它只需要 64 位表示。由于 F6 是第一个子类型,我们可以用 attribute definition clause 限制它的大小:

for F6'Size use 64;

这迫使编译器尝试仅使用 64 位进行表示。我不确定这是否能解决您的问题;可能是您无法通过这种方式规避错误,因为编译器需要一个可表示的基类型。

关于ada - 在定点声明中使用 gnat 出现奇怪的编译错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59207008/

10-13 04:32