从C++中具有非常量数组大小的函数返回一个数组指针

kri*_*nab 1 c++ arrays static

我构建了一个函数来在C++中生成一个随机的二维数组.我希望我可以在编译时设置数组的大小,所以我在数组中包含了行数和列数的变量.但是,当我尝试编译该函数时,我得到一个关于数组的存储大小不是常数的错误.这似乎与static我必须添加到数组定义的关键字有关,因此我可以从函数返回指针.我不确定是否有办法绕过这个错误?有什么建议.

double * generate_random_array(int rows, int cols, double lower_, double upper_){

static double test_array[rows][cols];

for (int i = 0; i < sizeof test_array / sizeof test_array[0]; i++) {
    for (int j = 0; j < sizeof test_array[0] / sizeof(double); j++) {
        test_array[i][j] = generate_random_numbers(lower_, upper_);
    }
}
return(test_array);

}
Run Code Online (Sandbox Code Playgroud)

Vit*_*meo 6

你可以做generate_random_array一个template,执行rowscols在编译时被称为:

template <int rows, int cols>
double* generate_random_array(double lower_, double upper_)
{
    /* ... as before ... */
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

generate_random_array<5, 10>(51.4, 66.0);
Run Code Online (Sandbox Code Playgroud)

不过,您应该使用std::array而不是C风格的数组.如果你想要可调整大小的数组,那么你应该使用std::vector.

std::array 例:

template <int rows, int cols>
auto generate_random_array(double lower_, double upper_)
{
    const auto idx = [](int x, int y){ return y * rows + x; };
    std::array<double, rows * cols> result;

    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            result[idx(i, j)] = generate_random_numbers(lower_, upper_);
        }
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

auto test_array = generate_random_array<5, 10>(11.0, 66.33);
Run Code Online (Sandbox Code Playgroud)

直播wandbox示例