编译失败并显示以下 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/