2014-01-21 3 views
1

Я получаю сообщение об ошибке «ожидается постоянное выражение» в последней строке следующего кода:C++: «ожидается постоянное выражение»

int main() { 
    const float a = 0.5f; 
    const float b = 2.0f; 

    int array_of_ints[int(a*b + 1)]; 
} 

Я думаю, это связано с тем, что int(a*b + 1) не известно, во время время компиляции, правильно? Мой вопрос: есть ли способ закодировать приведенный выше пример, чтобы он работал, и array_of_ints будет иметь размер int(a*b + 1)?

Любая помощь или понимание того, что происходит здесь будут оценены :)

Edit: Я понимаю, что вектор должен решить эту проблему. Однако я хочу, чтобы содержимое массива находилось в стеке.

+0

Я предполагаю, что вы используете Visual Studio? –

+2

сделать cast 'const int' или удалить листинг alltogether – bolov

+1

Использовать' new' и динамически выделять его на кучу –

ответ

2

Объявите const int:

int main() 
{ 
    const float a = 0.5f; 
    const float b = 2.0f; 
    const int s = static_cast<int>(a * b) + 1; 

    int array_of_ints[s]; 
    return 0; 
} 

Example

Обратите внимание, что это работает на старейшей компилятор у меня есть доступ к в момент (г ++ 4.3.2).

+0

вот что я искал, спасибо! – Dievser

6

Объявляет две константы, как constexpr (к сожалению, доступны только с C++ 11):

int main() { 
    constexpr float a = 0.5f; 
    constexpr float b = 2.0f; 

    int array_of_ints[int(a*b + 1)]; 
} 

В качестве альтернативы (для C++ C до + 11) вы можете use an std::vector.

+0

Спасибо за ваш ответ, я не знал о constexpr! Я не хочу использовать вектор, потому что я хочу, чтобы содержимое массива находилось в стеке. – Dievser

2

Если вы не используете C++ 11, то использовать std::vector:

std::vector<int> array_of_ints(int(a*b + 1)); 

Это приведет к вектору предварительно выделить указанное пространство и будет инициализировать все Интс к нулю.

+2

@DaleWilson, если честно, он говорил о 'std :: vector' 1 или 2 минуты, прежде чем я это сделал. Я повторил это только для полноты. – Shoe

+0

@Jefffrey - спасибо, что очистили это! – Sean

+1

@DaleWilson, я согласен. Но я могу гарантировать, что это не одно из них. :) – Shoe

-1

Ошибка «ожидаемого постоянного выражения» возникает при попытке объявить размер массива во время выполнения или во время выполнения. Это происходит потому, что компилятор не может; сначала вычислите размер массива, а затем выделите столько места для массива. Простым решением является объявление массивов с помощью const int e.g array [45]
Другой способ сделать это - создать динамический массив: int array_name = new int [size];

Смежные вопросы