Linux “事件掩码”的大小太小,允许的最小值为64

Linux “事件掩码”的大小太小,允许的最小值为64,linux,ada,ncurses,rhel,Linux,Ada,Ncurses,Rhel,当我在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:事件_掩码的大小太小,允许的最小值为64 如何解决这个问题?如果没有在t

当我在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:事件_掩码的大小太小,允许的最小值为64


如何解决这个问题?

如果没有在terminal_interface-curses-mouse.ads中看到相关声明,我无法确定。然而,我怀疑事件掩码的大小存在冲突。当我尝试时,这条线路被硬连接到terminal_interface-curses-mouse.ads.m4:

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

Bstate  at 0 range 128 .. 159;
这是基于mmask_t in的类型,它在我的系统上未签名。如果unsigned_long是64位,而C的unsigned类型是32位,编译器会抱怨

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

这有望避免大小太小的问题,而不会在代码的其余部分造成任何新的类型冲突。但是,我还没有测试它

这应该作为bug报告,因为事件掩码的类型不应该像这样硬连线

编辑:直到后来我才意识到,由于Event_Mask是一个派生类型,所以从Interfaces.C.unsigned_long和range约束派生它没有任何好处。假设mmask_t在.h文件中定义为unsigned,那么

type Event_Mask is new Interfaces.C.unsigned;

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

一个好的起点是显示terminal\u interface-curses-mouse的代码。ads:180:10,更具体地说,定义有问题的事件掩码的所有代码。我们很乐意提供帮助,但无法从这里读取您的屏幕…以上所有内容;但是,阅读configure,您可能可以使用-with-mmask-t='unsigned long'进行配置。
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;
type Event_Mask is new Interfaces.C.unsigned;