Array [n] vs Array [10] - Ініціалізація масиву зі змінною проти реального числа


90

У мене така проблема з моїм кодом:

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]працює.

Хтось знає чому?


4
Це допомогло б дати мову. У C ++ ваші масиви цієї форми повинні мати постійний розмір часу компіляції.
OrangeAlmondSoap

C ++, використовуючи Codeblocks з компілятором mingw32-g ++!
msmf14

Дякую, Джастін та @AndrewVarnerin, це вирішило! додано const перед int: const int n = 10; Вирішено!
msmf14

Відповіді:


188

У C ++ масиви змінної довжини не є законними. G ++ дозволяє це як "розширення" (оскільки це дозволяє C), тому в G ++ (не -pedanticдотримуючись стандарту C ++) ви можете зробити:

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

Якщо вам потрібен "масив змінної довжини" (краще називати його "динамічно розмірним масивом" у 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's a compile time constant)

Аналогічним чином, якщо ви хочете отримати розмір із функції в C ++ 11, ви можете використовувати constexpr:

constexpr int n()
{
    return 10;
}

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

1
Дякую, це ще одне хороше рішення. Зрештою мені дійсно потрібен вектор, а не масив!
msmf14

1
@ msmf14: Так, звичайні контейнери, начебто vector, неймовірно корисні.
Cornstalks

Чи ініціює векторне рішення кожен елемент, коли ви викликаєте "std :: vector <[деякий клас]> a (n);"?
Джастін

3
Якщо ви не виділяєте багато (якщо він невеликий порівняно з розміром стека), я віддаю перевагу використанню пам'яті стека з alloca (3) та розміщенням нового. Таким чином вам не потрібно турбуватися про звільнення пам'яті, і розподіл пам'яті відбувається набагато швидше.
holgac

2
+1 за згадку про те, що g ++ це дозволяє. Тому що я не спостерігав цієї помилки, і це пояснює різницю.
gebbissimo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.