Невозможно объявить переменные после операторов в DevC++

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

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

 return 0;
}

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

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 793
5

Ответы 5

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

Вы имеете в виду «В начале охвата».

OJ. 07.01.2009 15:30

В начале блока для C до ISO / IEC 9899: 1999 (C99)

Chris Young 07.01.2009 16:24

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

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

вы можете malloc()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;
}

Почему голос против? Это прекрасное решение проблемы.

Tamas Czinege 08.01.2009 07:20

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

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

Другие вопросы по теме