C++ 我想在函数中声明一个数组,其大小与main中的数组相同
我想在一个函数中声明一个数组,其大小与main中的数组相同,但在定义左[]数组的部分出现了一个错误。我可以做些什么来获得所需的输出或消除错误C++ 我想在函数中声明一个数组,其大小与main中的数组相同,c++,C++,我想在一个函数中声明一个数组,其大小与main中的数组相同,但在定义左[]数组的部分出现了一个错误。我可以做些什么来获得所需的输出或消除错误 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]
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);
}
你的错误在这里:
const int mid = s / 2;
int left[mid]; //getting error on the mid
s/2不是常量,因此不能用于生成数组,因为它需要是编译时常量才能符合标准。有些编译器允许这样做,但正如我所说,这不是标准的。MSVC给出了以下错误表达式,该表达式的计算结果不是常数
顺便说一下,C++中没有注释。
C++在Cuto to 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"
此问题的一个简单解决方案是将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样式数组类似,因此arr[0]将允许您访问数组中的第一个元素
但是,如果您希望能够创建具有动态大小的数组,您可以查看其他容器,如std::vector。如果您提供错误消息,这将非常有用。第二:你是否局限于C或者你可以使用C++吗?我不知道这是什么意思。我能做些什么来达到预期的结果?OP省略了一些单词,但问题很清楚。@LightnessRacesinOrbit抱歉,我的语言分析器失败了,你的似乎更高级了;afaik标准::向量左/2;避免发生2次分配
#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);
}
#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";
}
}