2013-11-20 3 views
2

Так что я продолжаю работать в этой проблеме, когда пытаюсь назначить значения массиву int. Я читал этот expected expression before '{' token, но я все еще смущен тем, почему он появляется в моем коде. У меня такое чувство, что я инициализирую и объявляю массив некорректно, и поэтому он дает мои проблемы.«Ожидаемое выражение перед» {«токен»

Итак, перед main() Я объявляю некоторую группу глобальных переменных (да, я знаю, что это опасно, но для моей цели требуется). С этой группой глобальных переменных Я также хочу, чтобы объявить двойной массив размером 3

double rob_size, rob_tilt; 
double rob_leftcolor [3]; 
double rob_rightcolor [3]; 

Затем в основной функции, я инициализирует переменные и массивы

rob_size = 1.0; 
rob_tilt = 0.0; 
rob_leftcolor [3] = {1.0, 0.0, 0.0}; 
rob_rightcolor [3] = {0.0, 1.0, 0.0}; 

Однако я получаю сообщение об ошибке «Ожидаемое выражение перед» {«токен» в.

Прежде всего, что означает это сообщение об ошибке? Во-вторых, это сообщение появляется, потому что я инициализирую и объявляю массивы неправильно?

Благодаря

ответ

6

Лучше делать init'ing на время объявления:

double rob_size = 1.0; 
double rob_tilt = 0.0; 
double rob_leftcolor [3] = {1.0, 0.0, 0.0}; 
double rob_rightcolor [3] = {0.0, 1.0, 0.0}; 

только массивы нужно быть сделано таким образом, но это лучше сделать их все одинаково.

Ваша альтернатива

rob_leftcolor[0] = 1.0; 
rob_leftcolor[1] = 0.0; 
rob_leftcolor[2] = 0.0; 
+0

Почему массивы ** необходимость ** Что делать? – user2930701

+3

Так как вы инициализируете массивы в C. –

+0

@ user2930701, потому что компилятор должен знать размер, если размер массива пуст ... если это не так, это просто потому, что язык c говорит об этом. –

1

Чарли Бернс правильно, это всегда лучше инициализировать массивы с фактическими значениями. Однако, используя код, который вы поставляется, как только вы объявить массив можно установить только определенные элементы:

double x[3]; 

x[0] = 1.1; 
x[1] = 2.2; 
x[2] = 3.3; 

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

0

Посмотрев на ответы и комментарии, я думаю, что есть еще несколько вещей, чтобы уточнить:

  1. Если переменные определены/объявлены вне любой функции тела в сборником блок, необходимо указать хранилище класс, например static
  2. Эти переменные будут помещены в раздел BSS из вашего исполняемого файла. И тогда вам лучше инициализировать.
  3. При определении массива вы можете использовать инициализатор {...} для его инициализации. Но вы не можете использовать его в инструкции присваивания.
  4. double rob_leftcolor[3] = {1.0, 0.0, 0.0} - это определение, а rob_leftcolor[3] = {1.0, 0.0, 0.0} - это присвоение, поэтому здесь вы не можете использовать инициализатор.
  5. Пожалуйста, убедитесь, что вы знаете различия между декларацией и определением в C.

Для класса хранения, рассмотрим ниже случай, без static, вы на самом деле определения глобальных переменных:

// a1.c 
static double rob_size, rob_tilt; 
rob_leftcolor [3] = {1.0, 0.0, 0.0}; 
rob_rightcolor [3] = {0.0, 1.0, 0.0}; 

int main(int argc, char** argv) { 
    rob_size = 1.0; 
    rob_tilt = 0.0; 
    return 0; 
} 

// a2.c 
rob_leftcolor [3] = {1.0, 0.0, 0.0}; 

Затем компилировать & связать их:

$ gcc -c a1.c 
a1.c:2:1: warning: data definition has no type or storage class [enabled by default] 
a1.c:3:1: warning: data definition has no type or storage class [enabled by default] 
$ gcc -c a2.c 
a2.c:1:1: warning: data definition has no type or storage class [enabled by default] 
$ gcc -o a a1.o a2.o 
a2.o:(.data+0x0): multiple definition of `rob_leftcolor' 
a1.o:(.data+0x0): first defined here 
collect2: error: ld returned 1 exit status 
+0

Не могли бы вы расширить первую концепцию определения класса хранения? – user2930701

+1

Вам не нужно указывать класс хранения. –

+0

Класс хранения определяет область видимости и продолжительность жизни переменных и/или функций в рамках программы C. Существуют следующие классы хранения, которые могут использоваться в программе C : 'auto',' register', 'static',' extern'. Фактически 'auto' является значением по умолчанию, и вам не нужно явно указывать переменную с классом хранения' auto'. Вы можете обратиться к «Язык программирования C» для класса хранения. – raof01

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