C++: Expression must have a constant value when declaring array inside function
我看了所有其他主题相似的帖子,没有帮助,所以请不要标记为重复。
我在
1 2 3 4 5 6 | int* Mode(int* numbers, int & mode, const int SIZE) { int occurences[SIZE]; // Calcualte mode } |
但是,我得到了错误,
我的函数调用(在主函数中)如下所示:
1 | int* occurencesPtr = Mode(numbersPtr, mode, SIZE); |
当
我理解错误是因为函数的
我甚至尝试过传递函数a
编辑:我不想使用可变大小!!注意,我已经把
编辑:动态数组不是我需要的。我只需要一个名为数组的普通数组,该数组是用传递给函数的常量大小值定义的。
这里对
1 2 | const int SIZE = 20; int array[SIZE]; |
但这并不是:
1 2 3 4 5 6 7 | void foo(const int SIZE) { int array[SIZE]; // ... } const int SIZE = 20; foo(SIZE); |
问题是数组声明中的数组大小必须是核心常量表达式。简化,这意味着在编译时可以计算为常量的表达式。在第一种情况下是这样的(你可以看到
1 2 3 4 | int x; if (std::cin >> x) { foo(x); } |
为了将一个参数传递到
1 2 3 4 5 | template <int SIZE> void foo() { ... } const int SIZE = 20; foo<SIZE>(); |
或:
1 2 3 4 5 | template <int SIZE> void foo(std::integral_constant<int, SIZE > ) { ... } const int SIZE = 20; foo(std::integral_constant<int, SIZE>{} ); |
或者简单地让
或者,总是有一个简单的选择:使用
1 2 3 4 | void foo(const int SIZE) { std::vector<int> v(SIZE); ... } |
0
选项1
不是在
1 2 3 4 5 6 7 8 9 10 11 12 | constexpr int getSize() { return 20; } int* Mode(int* numbers, int & mode) { int occurences[getSize()]; // ... } |
选项2
用
1 2 3 4 5 6 7 | int* Mode(int* numbers, int & mode, int size) { std::vector<int> occurences[size]; // ... } |
选项3
使用函数模板。
2选项4
使用函数模板和
1 2 3 4 5 6 7 8 | template <size_t SIZE> int* Mode(int* numbers, int & mode, int size) { std::array<int, SIZE> occurences; // ... } |
你把事情搞混了。
让我们假设我们是编译器,面对这个函数:
1 | void foo(const int SIZE) { } |
因为没有人阻止我们做这样的事情:
1 2 3 | int i{}; std::cin >> i; foo(i); |
可以将任何(匹配/可转换)值传递给by-value
当编译器假定传递给
如果要传递编译时间常量,请使用模板,在传递时使用
1 2 3 4 5 | template<std::size_t N> void foo() { std::array<int, N> occurences; } |
当函数定义中使用
为了使用您可以使用的全局可访问常量值,如
噢,还有,
我已经编辑了代码以满足您的特定约束。
以下是原始代码的变体:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | int main(){ //Declare constants first. const int SIZE = 20; /*Could declare here instead.*/ //Declare variables next. int *intPtr = 0; // to hold the pointer passed from Mode. int *numbersPointer = 0; int mode = 0; //Define Mode (using OP's code.) int* Mode(int* numbers, int & mode, const int size){ int occurences[size]; // Calculate mode } /*Now use constants, variables, and functions.*/ intPtr = Mode(numbersPointer, mode, SIZE); //Call mode. return 0; } |