Невозможно объявить переменные после операторов в DevC ++ - PullRequest
1 голос
/ 07 января 2009

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

int main()
{
 int b;
 b = sisesta();
 float st[b];

 return 0;
}

Я хотел бы объявить массив st с его размером, возвращаемым другой функцией, но он не позволит мне сделать это! Говорит "Ошибка разбора перед плавающей точкой". Кстати, это в Си, но я думаю, что оно идентично тому, что было бы в других языках с таким же синтаксисом.

Любая помощь приветствуется.

Ответы [ 5 ]

6 голосов
/ 07 января 2009

В стандартах C до C99 вы должны объявлять свои локальные переменные в начале функции. Начиная с C99, это больше не требуется.

Поскольку Dev-C ++ поставляется с gcc, а последние версии gcc частично поддерживают C99, вы можете попробовать добавить -std=c99 в список аргументов gcc в настройках Dev-C ++ для запуска режима C99.

2 голосов
/ 07 января 2009

Чувак в C вы должны объявить все переменные в начале. Вы не можете объявить между утверждениями

0 голосов
/ 18 марта 2009

Даже в C89 это был просто стилистический выбор делать все объявления в начале функции - проблема, с которой вы столкнулись в своем коде, заключалась в том, что вы пытались объявить массив в стеке неизвестного размера, и это не было разрешено до C99. Если вы сделаете тот же код, но замените «float st [b]» на оператор, где «b» является константой, он будет работать, как «float st [10]»

0 голосов
/ 08 января 2009

Оказывается, у меня только что была старая версия DevC ++, которая не поддерживала более новый стандарт, с последним выпуском заявления работают нормально, в любом случае спасибо за помощь.

0 голосов
/ 07 января 2009

вы можете malloc() a float* до нужного размера (просто не забудьте free() впоследствии):

int main()
{
 int b;
 float *st;

 b = sisesta();

 if((st = malloc(sizeof float * b)) == NULL){exit 1;}

 /* blah blah */

 free(st);
 return 0;
}
...