Ожидаемая константа в 2d массиве

0
double rainPerMonth(const int YEARS)
{
   int monthYear[MONTHS][YEARS];
   // ...
}

Visual Studio показывает строку squiggly под объявлением массива, говоря, что YEARS должен быть константой, когда я создаю массив. Является ли это проблемой IDE, потому что переменная еще не инициализирована, или я пишу это неправильно?

MONTHS уже объявлены глобально.

  • 2
    "Visual бросает меня волнистым" удивительным
Теги:
arrays

3 ответа

5
Лучший ответ

Размер массива должен быть постоянным выражением, то есть значением, известным во время компиляции. (Некоторые компиляторы предлагают массивы переменной длины C-типа как нестандартное расширение, но я не думаю, что Visual C++ делает. Даже если это так, лучше не полагаться на такие расширения.)

Аргумент функции не известен во время компиляции, поэтому его нельзя использовать как размер массива. Ваш лучший вариант здесь, вероятно,

std::vector<std::array<int, MONTHS>> monthYear(YEARS);
  • 0
    Я собираюсь исследовать ваш ответ, чтобы понять, что в нем происходит, так как я новичок в c ++, но мне интересно, смогу ли я инициализировать его с константой 1 и добавить monthYEAR на основе пользовательского ввода внутри функции.
  • 1
    @JustinGrahn Не с массивом. Вы можете сделать это либо с помощью std::vector либо с помощью динамического выделения памяти.
Показать ещё 9 комментариев
2

В C++ массив должен иметь размер во время компиляции. То, что вы пытаетесь сделать, это объявить тот, который имеет размер во время выполнения. В объявленной функции YEARS является постоянным только в рамках функции. Вы можете назвать это rainPerMonth(someInt); где someInt является результатом некоторого ввода пользователя (который показывает вам, что результат не является константой времени компиляции).

Массивы переменной длины являются расширением до C, но не C++. Чтобы сделать то, что вы хотите, вы можете использовать динамическую память или std::vector.

0

Я думаю, что ваша проблема заключается в том, что C++ хочет, чтобы константа в константе времени компиляции создавала переменную monthYear. Если вы передадите его как функцию, его не нужно знать во время компиляции? Например:

const int x=2;
const int y=3;

char xyChoice;
std::cin >> xyChoice;

if (xyChoice == 'x')
rainPerMonth(x);
else
rainPerMonth(y);

Я не уверен, но мне кажется, что это даст вам постоянный int, который будет передан вашей функции, но компилятор не знает, какой размер для создания массива до запуска?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню