无法在 ncurses 中使用 LINES 和 COLS 作为常量

Not able to use LINES and COLS as constants in ncurses

大家好——第一次发帖。我正在使用 ncurses 在 C 中构建一个程序,我需要声明一个二维数组,它是用户终端屏幕的高度和宽度,这当然会因用户而异(我们假设它将保持不变而 运行 程序)。那里的许多文档告诉我 Ncurses 提供 LINES 和 COLS 作为等于我的屏幕大小的常量,但是当我尝试使用这些 "constants" 来声明我的数组大小时我遇到编译错误("variable-sized object may not be initialized").

我熟悉 getmaxyx 函数,它 returns 与 LINES 和 COLS 的尺寸相同,window 即终端屏幕的尺寸。所以数学加起来很好。

如何将用户屏幕的尺寸作为二维数组的维度?

您唯一的问题是错误消息的内容:"variable-sized object may not be initialized".

换句话说,你正在写这样的东西:

int main(void) {
  int screen[LINES][COLS] = {{0}};

而不是:

int main(void) {
  int screen[LINES][COLS];
  for (int r = 0; r < LINES; ++r)
    for (int c = 0; c <  COLS; ++c)
      screen[r][c] = 0;

LINESCOLS 不是常数,它们是变量。 (除非你是 运行 一个没有 windowing 系统的 OS,假设它们在会话期间不会改变也是非常乐观的。如果用户调整他们的控制台大小,它们将会改变window。如果您对调整大小没有做出适当的响应,您的应用就会有问题。)

即使它们在程序执行期间没有改变,编译器也不知道它们的值,这会阻止它初始化(根据 C 标准)。所以它坚持要你手动初始化数组,如果你想要它被初始化的话。

但是声明是没有问题的

注意: 正如 Thomas Dickey 在评论中指出的那样,可变长度数组 (VLA)(如您的 screen)并未普遍实现,因为 C11 使该功能可选。如果您遇到此问题,最可能的原因是您正在使用 Microsoft 的 C 编译器,这是使用最广泛的不支持 VLA 的现代编译器。在这种情况下,您要么必须重写代码来自己计算数组下标,要么使用不同的编译器。