Невозможно использовать LINES и COLS как константы в ncurses - PullRequest
0 голосов
/ 28 мая 2020

Приветствую всех - здесь впервые постер. Я создаю программу на C, используя ncurses, где мне нужно объявить двумерный массив, который представляет собой высоту и ширину экрана пользовательского терминала, который, конечно, будет варьироваться от пользователя к пользователю (мы предполагаем, что это будет оставаться постоянным во время работы программы). Большая часть документации говорит мне, что Ncurses предоставляет LINES и COLS как константы, которые равны размеру моего экрана, но я получаю ошибку компиляции, когда пытаюсь использовать эти «константы» для объявления размера моего массива («переменная- размер объекта не может быть инициализирован ").

Я знаком с функцией getmaxyx, и она возвращает те же размеры, что и LINES и COLS для окна размером с экран терминала. Итак, математика складывается отлично.

Как я могу использовать размер экрана пользователя в качестве размеров двумерного массива?

1 Ответ

0 голосов
/ 28 мая 2020

Ваша единственная проблема заключается в том, что говорится в сообщении об ошибке: «объект переменного размера не может быть инициализирован».

Другими словами, вы пишете что-то вроде:

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;

LINES и COLS не являются константами, это переменные. (Если вы не используете ОС без оконной системы, также очень оптимистично c предполагать, что они не изменятся во время сеанса. Они изменятся, если пользователь изменит размер окна консоли. Если вы не ответите должным образом на изменение размера, ваше приложение будет проблематично c.)

Даже если они не меняются во время выполнения программы, их значения не известны компилятору, что предотвращает его инициализацию ( по стандарту C). Поэтому он требует, чтобы вы инициализировали массив вручную, если хотите, чтобы он был инициализирован.

Но нет проблем с его объявлением.

Примечание: Как Томас Дики указывает в комментарии, массивы переменной длины (VLA) (например, ваш screen) реализованы не повсеместно, поскольку C11 сделал эту функцию необязательной. Если вы столкнулись с этой проблемой, наиболее вероятная причина заключается в том, что вы используете компилятор Microsoft C, который является наиболее широко используемым современным компилятором, который не поддерживает VLA. В этом случае вам придется либо переписать код, чтобы выполнить собственное вычисление индексов массива, либо использовать другой компилятор.

...