C объявляет 2d массив с использованием констант - PullRequest
1 голос
/ 08 ноября 2010

У меня есть файл заголовка для игры, который объявляет 2d массив для доски.

#ifndef GAME_H_
#define GAME_H_

static const int columns = 15;
static const int rows = 15;

int board[rows][columns];

#endif /* GAME_H_ */

Я получаю ошибку "error: variably modified 'board' at file scope".

Ответы [ 6 ]

7 голосов
/ 08 ноября 2010

C не допускает использование const переменных в качестве границ массива.Вместо этого используйте перечисление:

enum { columns = 15, rows = 15 };
3 голосов
/ 08 ноября 2010

Это выражение недопустимо, его можно использовать в C ++, единственный способ обойти это - определить его так:

2 голосов
/ 08 ноября 2010

Начиная с C99, вы можете объявить так называемый массив переменной длины (VLA), где размер измерения массива является непостоянным выражением; IOW, вы можете сделать это:

int foo()
{
  int x = 5;
  int y = 10;
  int values[x][y];
  ...
}

Обратите внимание, что это только верно для C99; C89 и более ранние версии требуют использования константных выражений во время компиляции для измерения массива.

Проблема с VLA состоит в том, что из-за того, как они работают, они могут быть объявлены только в области видимости (то есть внутри функции или составного оператора в функции); они не могут быть объявлены как static или extern, и они не могут быть объявлены в области видимости файла (которая является источником вашего конкретного сообщения об ошибке).

В этом конкретном случае вам нужно будет использовать постоянные выражения времени компиляции (которые const -качественные переменные не ):

#define COLUMNS 15
#define ROWS    15

extern int board[ROWS][COLUMNS];

Обратите внимание на добавление ключевого слова extern в объявлении массива. Вы не хотите, чтобы объявление в заголовочном файле было объявлением , определяющим для массива; вместо этого поместите объявление , определяющее , в исходный файл, который фактически реализует игровую доску. В противном случае каждый исходный файл, включающий этот заголовок, попытается создать собственное определение для board, и он будет решать компоновщику, чтобы разобраться во всем.

1 голос
/ 08 ноября 2010
int board[rows][columns];

недопустимо C. Вы можете определить массив только с константой, но не со ссылкой на переменную. Даже если ссылка на переменную ссылается на постоянное значение, строки и столбцы являются ссылками на постоянные значения, а не на сами постоянные значения.

Есть несколько способов заставить это работать так, как вы хотите:

  1. Вы можете определить «переменные» в препроцессоре, чтобы они были сведены в константы непосредственно перед временем компиляции.
  2. Вы можете определить значения как часть перечисления enum, поскольку правила перечисления для компилятора C должны автоматически преобразовывать их в их постоянные значения при обнаружении несоответствия типов.
0 голосов
/ 09 ноября 2010

объявления массива должны иметь постоянное значение перед компиляцией.Вы можете #define переменные в нем или использовать указатели, чтобы он работал как массив.Оба способа хороши и дадут вам одинаковые результаты и простоту.

0 голосов
/ 08 ноября 2010

Попробуйте это

Посмотрите, поможет ли вам вышеуказанная ссылка.

...