double rainPerMonth(const int YEARS)
{
int monthYear[MONTHS][YEARS];
// ...
}
Visual Studio показывает строку squiggly под объявлением массива, говоря, что YEARS
должен быть константой, когда я создаю массив. Является ли это проблемой IDE, потому что переменная еще не инициализирована, или я пишу это неправильно?
MONTHS
уже объявлены глобально.
Размер массива должен быть постоянным выражением, то есть значением, известным во время компиляции. (Некоторые компиляторы предлагают массивы переменной длины C-типа как нестандартное расширение, но я не думаю, что Visual C++ делает. Даже если это так, лучше не полагаться на такие расширения.)
Аргумент функции не известен во время компиляции, поэтому его нельзя использовать как размер массива. Ваш лучший вариант здесь, вероятно,
std::vector<std::array<int, MONTHS>> monthYear(YEARS);
std::vector
либо с помощью динамического выделения памяти.
В C++ массив должен иметь размер во время компиляции. То, что вы пытаетесь сделать, это объявить тот, который имеет размер во время выполнения. В объявленной функции YEARS
является постоянным только в рамках функции. Вы можете назвать это rainPerMonth(someInt);
где someInt
является результатом некоторого ввода пользователя (который показывает вам, что результат не является константой времени компиляции).
Массивы переменной длины являются расширением до C, но не C++. Чтобы сделать то, что вы хотите, вы можете использовать динамическую память или std::vector
.
Я думаю, что ваша проблема заключается в том, что C++ хочет, чтобы константа в константе времени компиляции создавала переменную monthYear
. Если вы передадите его как функцию, его не нужно знать во время компиляции? Например:
const int x=2;
const int y=3;
char xyChoice;
std::cin >> xyChoice;
if (xyChoice == 'x')
rainPerMonth(x);
else
rainPerMonth(y);
Я не уверен, но мне кажется, что это даст вам постоянный int, который будет передан вашей функции, но компилятор не знает, какой размер для создания массива до запуска?