c - 为什么 init_pair 在 COLOR_PAIRS 范围的一半内失败?
问题描述
在我的平台上:
- OSX 莫哈韦 10.14.2
来自 Homebrew 的 ncurses:
$ brew info ncurses ncurses: stable 6.1 (bottled) [keg-only]
通过这个 makefile 配置构建:
pkgenv=PKG_CONFIG_PATH=/usr/local/opt/ncurses/lib/pkgconfig pkg-config ncursesw
flags=-Wall -std=c17 -ggdb
cflags=$(flags) $(shell $(pkgenv) --cflags)
ldflags=$(flags) $(shell $(pkgenv) --libs)
这个最小的可重现示例失败:
#include <assert.h>
#include <ncursesw/ncurses.h>
int main() {
assert(NULL != initscr());
assert(has_colors());
assert(can_change_color());
assert(ERR != start_color());
assert(COLOR_PAIRS == 0x10000);
assert(COLORS == 256);
assert(ERR != init_pair(1, 9, 10));
assert(ERR != init_pair(0x7FFE, 9, 10));
// OK up to here
// Fails
assert(ERR != init_pair(0x7FFF, 9, 10));
endwin();
puts("OK");
return 0;
}
但为什么?什么COLOR_PAIRS
报告(65536)和什么init_pair
接受(1-32766)似乎是两个不同的东西。对于它的价值,浏览头文件,
#define NCURSES_PAIRS_T short
他们为此选择了签名数量,这很奇怪。
解决方案
颜色对的标准类型是 (signed) short
,在大多数机器上是 16 位的。原因是它可以追溯到 1980 年代,当时空间(和颜色可用性)更加有限。
ncurses 6.1具有允许 32 位值的扩展(例如,使用init_extended_pair
),这brew的公式似乎允许,尽管到目前为止没有人对此发表评论。
如手册页的可移植性部分所述init_pair
X/Open Curses 没有指定终端可以支持的颜色和颜色对的数量限制。但是,在使用参数的缩写时,它继承了SVr4对已编译 terminfo 数据库的实现细节,该数据库使用带符号的 16 位数字。这个实现提供了那些使用短参数的函数的扩展版本,允许应用程序使用更大的颜色和对数。
为了您的娱乐,这里的截图使用了 ncurses 6.1 的扩展数字功能
推荐阅读
- android - 在矩阵 sdk 中推送通知
- php - 从与单列分隔的逗号中检索数据的方法是什么?
- java - 使用java在excel中列出地图数据
- amazon-web-services - AWS - Elasticbeanstalk - 角色政策中的问题
- java - Android WebView 不重定向到另一个页面。SPA网站
- python - pip 显示安装过程中软件包安装的依赖关系
- android - E/zzf:检索 SafetyNet 令牌时出现问题:7:Android
- julia - 在 Julia 中有效地循环遍历结构
- c# - WPF 列表框分层项模板
- ios - “Realm.framework”无法打开,因为无法验证开发者。Xcode