当我在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
如何解决问题?
答案 0 :(得分:0)
如果没有看到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;
这取决于mmask_t
中<ncurses.h>
的类型,我系统上的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
在unsigned
文件中定义为.h
,它应该可以正常工作
type Event_Mask is new Interfaces.C.unsigned;
您仍然需要手动更改它,并且确实需要修复.m4
文件和生成器以找出正确的类型,这就是为什么我认为这应该被视为ncurses
中的错误