gpt4 book ai didi

c++ - 如何通过传递指针来调用参数类型为高维数组的函数?

转载 作者:行者123 更新时间:2023-11-30 03:55:13 24 4
gpt4 key购买 nike

例如,我有一个函数(需要c99)

void fun(int nx, int ny, double a[nx][ny])
{
// some code here
}

我有一个指针

double *p = new double[nx * ny];

然后用它来调用函数

fun(nx, ny, p); // error for the type is not matched

怎么做?允许任何类型转换。

最佳答案

你想要的在 C++ 中是不可能的,因为 C++ 要求数组类型的大小是编译时常量。 C99没有这个限制,所以函数声明

void fun(int nx, int ny, double a[nx][ny]);

是有效的 C99,但不是有效的 C++。顺便说一句,在 C99 中,这个函数的正确调用应该是这样的:

int nx = ..., ny = ...;
double (*matrix)[ny] = malloc(nx*sizeof(*matrix));
fun(nx, ny, matrix);

现在,您有两种可能性:

  1. 将 C 语言用于多维数组。

  2. 为此使用 C++ 解决方法。


最简单的 C++ 解决方法是 vector<vector<double> > .这样您就避免了自己分配内存的麻烦,但是,二维矩阵中的行不是连续的。


您还可以像这样使用两层间接寻址:

double **matrix = new double*[nx];
for(int i = 0; i < ny; i++) matrix[i] = new double[ny];

并将你的函数声明为

void fun(int nx, int ny, double** a);

请注意,除了保存数据的数组之外,您还需要一个额外的索引数组。但是,您可以自由使用单个大数组来保存数据:

double** matrix = new double*[nx];
double* storage = new double[nx*ny];
for(int i = 0; i < ny; i++) matrix[i] = &storage[ny*i];

最后可能的解决方法是,自己进行索引计算:

void fun(int nx, int ny, double* twoDArray) {
//access the array with
twoDArray[x*ny + y];
}

//somewhere else
double* matrix = new double[nx*ny];
fun(nx, ny, matrix);

这正是 C99 在底层对顶部代码所做的,但类型检查要少得多。

关于c++ - 如何通过传递指针来调用参数类型为高维数组的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29182008/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com