Подтвердить что ты не робот

Array [n] vs Array [10] - Инициализация массива с переменным vs действительным числом

У меня возникает следующая проблема с моим кодом:

int n = 10;
double tenorData[n]   =   {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

Возвращает следующую ошибку:

error: variable-sized object 'tenorData' may not be initialized

В то время как работает double tenorData[10].

Кто-нибудь знает, почему?

4b9b3361

Ответ 1

В С++ массивы переменной длины не являются законными. g++ допускает это как "расширение" (потому что C разрешает его), поэтому в g++ (не будучи -pedantic о следующем стандарте С++) вы можете сделать:

int n = 10;
double a[n]; // Legal in g++ (with extensions), illegal in proper C++

Если вам нужен "массив переменной длины" (лучше называемый "массив с динамическим размером" на С++, поскольку правильные массивы переменной длины не разрешены), вам либо приходится динамически выделять память самостоятельно:

int n = 10;
double* a = new double[n]; // Don't forget to delete [] a; when you're done!

Или, еще лучше, используйте стандартный контейнер:

int n = 10;
std::vector<double> a(n); // Don't forget to #include <vector>

Если вы все еще хотите создать правильный массив, вы можете использовать константу, а не переменную при ее создании:

const int n = 10;
double a[n]; // now valid, since n isn't a variable (it a compile time constant)

Аналогично, если вы хотите получить размер от функции в С++ 11, вы можете использовать constexpr:

constexpr int n()
{
    return 10;
}

double a[n()]; // n() is a compile time constant expression