@dmitriyuvin
FullStack developer ( Laravel & Vue )

Как исправить «Выражение должно иметь константное значение»?

Обьявляю массив:
int rows = 7;
	int cols = 8;
	float array[rows][cols];

Ошибка "Выражение имеет константое значение".
Как исправить?
Я как-то исправлял с помощью sizeof/malloc, забыл только
  • Вопрос задан
  • 12707 просмотров
Пригласить эксперта
Ответы на вопрос 5
@res2001
Developer, ex-admin
То как вы используете массив называется VLA (Variable Length Array). Появилось только в стандарте С99. В С++ его нет в принципе.
Чтоб использовать VLA нужно компилятору явно задать используемый стандарт. Для gcc: -std=c99 или -std=c11. C11 - стандарт 2011 года.
Если вы используете компилятор от микрософт (в составе MSVS например), то могу вас опечалить - микрософт никогда не стремилась поддерживать стандарты Си. Поддержки VLA там нет и вряд ли будет в ближайшее время.

Но вообще не рекомендуется использовать VLA без четкого понимания что это, как работает и к каким последствиям может привести. Например, в свое время в ядре линукс была целая компания по выкорчевыванию кода с VLA. Так что лучше воспользуйтесь динамическими массивами или статическими с константными размерностями.
Ответ написан
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
Не заниматься такой ерундой.
Либо
float array[7][8];
либо
float *aptr;
aptr = (float *) calloc(sizeof(float), 7 * 8);
Ответ написан
Комментировать
GavriKos
@GavriKos
Почитайте про динамические массивы в C.
А исправить просто - сделать rows и cols константами, о чем пишет компилятор.
Ответ написан
wisgest
@wisgest
Не ИТ-специалист
#define rows 7
#define cols 8
float array[rows][cols];
Ответ написан
Комментировать
myjcom
@myjcom
float** array = malloc(M * sizeof(*float));
for(int i = 0; i < M; i++)
  array[i] = malloc(N * sizeof(float));

В Си кастить после malloc не надо.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы