我想在函数中声明一个数组,并且在主对接中出现数组大小

时间:2018-11-21 10:27:13

标签: c++

我想在函数内部声明一个数组,其大小为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);
}

3 个答案:

答案 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