我想在函数内部声明一个数组,其大小为main
,但是在定义left[]
数组的部分出现错误。我该怎么做才能获得所需的输出或消除错误?
void merge_sort(int * A, const int s)
{
const int mid = s / 2;
int left[mid]; // getting error about mid
}
int main()
{
const int SIZE = 9;
int arr[SIZE] = {1,2,4,5,1,2,3,3,4};
merge_sort(arr, SIZE);
}
答案 0 :(得分:4)
C ++(与C相反)不支持可变长度数组,即至少一维不是编译时常数的数组。
const int mid = s / 2;
int left[mid];
在您的程序中,s
在编译时未知,因此mid
在编译时未知。因此int left[mid]
是标准C ++不支持的可变长度数组
在C ++中,您可能会使用std::vector
之类的(动态)容器并预先设置尺寸(而不是一个接一个地将其推入其中):
std::vector<int> left;
left.resize(s/2);
left[0] = 10; // access it just like an "old style array"
答案 1 :(得分:1)
您的错误在这里:
const int mid = s / 2;
int left[mid]; //getting error on the mid
s / 2不是常数,因此不能用作数组,因为它必须是编译时常数才能符合标准。有一些编译器允许这样做,但是正如我所说,这不是标准的。 MSVC给出以下错误expression did not evaluate to a constant
。
顺便说一句,#
不是C ++中的注释。
答案 2 :(得分:0)
error: ‘s’ is not a constant expression
int mid = s / 2;
^
一个简单的解决方案是使SIZE成为全局constexpr变量,然后使用该变量来计算其他常量表达式。
#include <iostream>
constexpr size_t SIZE = 9;
void merge_sort(int* A)
{
constexpr size_t mid = SIZE / 2;
int left[mid];
}
int main()
{
int arr[SIZE] = {1,2,4,5,1,2,3,3,4};
merge_sort(arr);
}
考虑使用C ++中的std::array
而不是使用c样式的数组,它使您可以使用迭代器和其他方便的C ++功能。转换后,它看起来像这样:
#include <iostream>
#include <array>
constexpr size_t SIZE = 9;
void merge_sort(std::array<int, SIZE>& A)
{
constexpr size_t mid = SIZE / 2;
std::array<int, mid> left;
}
int main()
{
std::array<int, SIZE> arr = {1,2,4,5,1,2,3,3,4};
merge_sort(arr);
for(auto v : arr) {
std::cout << v << "\n";
}
}
下标运算符(operator[]
)在c样式数组上的工作方式类似,因此arr[0]
将使您可以访问数组中的第一个元素。
但是,如果您希望能够创建具有动态大小的数组,则可以看看其他容器,例如std::vector
。