2010-11-08 2 views

ответ

7

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

enum { columns = 15, rows = 15 }; 
0

Try this

Смотрите, если выше ссылка поможет вам любой.

+0

Я знаю, что этот ответ (и вопрос, на который вы ссылаетесь) сейчас довольно старый, но можете ли вы вытащить важные части в ответ? (Или, если этот вопрос является обманом того, с чем вы связались, произнес оглашение) –

3

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

#ifndef GAME_H_ 
#define GAME_H_ 

#define COLUMNS 15 
#define ROWS 15 

int board[ROWS][COLUMNS]; 

#endif /* GAME_H_ */ 
1
int board[rows][columns]; 

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

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

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

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

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

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

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

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

#define COLUMNS 15 
#define ROWS 15 

extern int board[ROWS][COLUMNS]; 

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

0

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

Смежные вопросы