在我的程序中,我使用ncurses在屏幕上显示输出(仅在屏幕上的特定位置中的字符,没有高级功能)。以前,它起作用了。我没有安装,卸载,更改任何软件,任何配置。我只更改了代码。
颜色信息使我了解了程序的内部数据结构,因此有助于调试和改进程序。作为参考,我将this网站用于ncurses。它最大的缺陷是它没有显示各种功能的预期数据类型,也没有有关不同数据片段可接受范围的信息。例如,多少种颜色,几种颜色对...
我的恐惧是我滥用功能init_pair()
。
我称之为程序的开头:
initscr ();
start_color ( );
noecho ();
enum
{
NORMAL=1,
BOX,
};
init_pair ( NORMAL , COLOR_WHITE , COLOR_BLACK );
init_pair ( BOX , COLOR_RED , COLOR_BLACK );
attron ( COLOR_PAIR ( BOX ) );
addch ( 'x' );
attroff ( COLOR_PAIR ( NORMAL ) );
attroff()
的争论不好,但效果很好。
但是在我的代码中,我需要根据某些数据来确定背景颜色,以及其他一些数据的前景颜色。因此,定义简单的数字颜色对的策略是非直觉的。
我更改为这样的事情:// foreground colors
# define FG_NORMAL ( COLOR_WHITE )
# define FG_TARGET ( COLOR_YELLOW )
// background colors
# define BG_OUTSIDE ( COLOR_BLACK )
# define BG_AGAW ( COLOR_MAGENTA )
init_pair ( 16 * FG_NORMAL + BG_OUTSIDE , FG_NORMAL , BG_OUTSIDE );
init_pair ( 16 * FG_TARGET + BG_AGAW , FG_TARGET , BG_AGAW );
// decide the actual colors to be used
if ( some__condition ) { colorBG = BG_AGAW ; }
if ( other_condition ) { colorFG = FG_TARGET ; }
theChar = 'x';
addch ( theChar | COLOR_PAIR ( 16 * colorFG + colorBG ) );
在本质上我使用的而不是最后一行:
attron ( COLOR_PAIR ( 16 * colorFG + colorBG ) );
addch ( theChar );
attroff ( COLOR_PAIR ( 16 * colorFG + colorBG ) );
IT
should工作,因为第一个论点仍然适合8位(并且自动类型铸造使其适合任何其他类型)。
,尽管图像虽然正确,但只是简单的黑白,没有颜色。 我正确地猜到问题在于问题是init_pair()
的第一个参数吗?如果没有,可能是什么问题?
使用调试器使用断点,代码执行了预期的行。ncurses的文档(质量):我发现
init_pair()
的参数不是addch()
,而是一个
char
!因此,我可能已经在例行程序的其他部分击中了类似的东西。
aaaaaaaaially,我成功找到了这个问题。根问题是Ncurses的不良文档。网上的所有位置都在其他地方的复制品中得到了很多复制。其他用户抱怨同一件事。
,在我的具体情况下,我的color_pairs = 64。所以我最初所做的:
short
定义了允许范围以外的一些颜色对。为什么我没有任何颜色,而不是只有一些颜色,这是另一个问题(但不相关的问题)。
我这样将颜色包装成颜色对:
init_pair ( 16 * FG_NORMAL + BG_OUTSIDE , FG_NORMAL , BG_OUTSIDE );
(请注意16到8的变化),我有颜色。
现在我可以很高兴继续调试。