【问题标题】:size for "Event_Mask" too small, minimum allowed is 64“Event_Mask”的大小太小,允许的最小值为 64
【发布时间】:2014-07-09 06:08:40
【问题描述】:

当我在 red hat linux 中创建 ncurses-5.9 时,出现以下问题:

gcc -c -g -O2 -gnatafno -gnatVa -gnatwa -I- -gnatA /home/xiaodobl/ncurses-5.9/Ada95/src/terminal_interface-curses-mouse.adb

错误是:

terminal_interface-curses-mouse.ads:180:10:“Event_Mask”的大小太小,允许的最小值为 64

如何解决这个问题?

【问题讨论】:

  • 一个很好的起点是显示 terminal_interface-curses-mouse.ads:180:10 周围的代码,更具体地说,是定义相关 Event_Mask 的所有代码。我们很乐意提供帮助,但无法从此处读取您的屏幕...

标签: linux ada ncurses rhel


【解决方案1】:

没有看到terminal_interface-curses-mouse.ads 中的相关声明,我无法确定。但是,我怀疑Event_Mask 的大小存在冲突。当我尝试它时,这条线被硬连线到terminal_interface-curses-mouse.ads.m4

type Event_Mask is new Interfaces.C.unsigned_long;

但是Mouse_Event 的 rep 子句定义了 Bstate,类型为 Event_Mask,如下所示:

Bstate  at 0 range 128 .. 159;

这是基于<ncurses.h>mmask_t 的类型,即我系统上的unsigned。如果unsigned_long是64位,C的unsigned类型是32,编译器会报错。

如果发生这种情况,请尝试手动将 type Event_Mask 行更改为

type Event_Mask is new Interfaces.C.unsigned_long range 0 .. 2**32 - 1;
for Event_Mask'Size use 32;

type Event_Mask is new Interfaces.C.unsigned_long range 0 .. 2**32 - 1 with Size => 32;

这有望避免“尺寸太小”的问题,而不会在其余代码中引起任何新的类型冲突。但是,我还没有测试过。

这应该报告为一个错误,因为 Event_Mask 的类型不应该像这样硬连线。

编辑:直到后来我才意识到,由于 Event_Mask 是派生类型,因此从 Interfaces.C.unsigned_long 派生它并具有范围约束没有任何好处。假设mmask_t.h 文件中被定义为unsigned,它应该同样有效

type Event_Mask is new Interfaces.C.unsigned;

您仍然需要手动更改它,并且确实需要修复 .m4 文件和生成器以找出正确的类型,这就是为什么我认为这应该被视为 ncurses 中的一个错误。

【讨论】:

  • 以上所有;但是,阅读configure,您也许能够摆脱使用--with-mmask-t=‘unsigned long’ 的配置。
猜你喜欢
  • 1970-01-01
  • 2022-10-12
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 2011-02-26
  • 2013-10-22
  • 2011-01-23
  • 1970-01-01
相关资源
最近更新 更多