Почему при обьявлении константной переменной с помощью тернарного оператора не удаёться создать двумерный массив
Мне нужно создать двумерный массив размер которого определиться в ходе условия что-то вроде
void func(value)
{
const char size = (value == 1) ? 10 : (value == 2) ? 20 : 0;
int m[size][4] = {};
}
Но возникает ошибка выражение должно иметь константное значение
в чем проблема если size константа?
Ответы (2 шт):
size это константа, но 'value' которая участвует в вычислениях не является константой. Значение константной size станет известно только после вычислений которые вы задали. Размер статического массива должен быть известен на этапе компиляции. Я сейчас нашел несколько способов решения этой задачки:
1)
void func()
{
const int value = 1; //Вместо 1 можно поставить любое константное число
const char size = (value == 1) ? 10 : (value == 2) ? 20 : 0;
int m[size][4] = {};
}
Но тогда в этих вычислениях не будет смысла. Даже если вы укажете const в параметре функции это все равно не поможет
void func(const int value)
{
...
}
так как мы все равно можем передать в функцию разные значения 'value' во время выполнения программы, а раз это так, то и размер массива будет известен только во время выполнения программы, а так как это статический массив его размер должен быть известен уже на этапе компиляции.
- Динамически выделить массив и не забыть освободить память.
void func(int value)
{
const char size = (value == 1) ? 10 : (value == 2) ? 20 : 0;
int** m = new int*[size];
for (size_t i = 0; i < size; i++)
{
m[i] = new int[4];
}
//Освобождаем память
for (size_t i = 0; i < size; i++)
{
delete[] m[i];
}
delete[] m;
m = nullptr;
}
При определении массива простого const в общем-то недостаточно: const - это просто обещание не менять полученное при инициализации значение. А нужен constexpr - т.е. это значение известно при компиляции, а не в момент инициализации.