gpt4 book ai didi

c++ - 使用 C++ 的二维数组

转载 作者:太空狗 更新时间:2023-10-29 23:21:40 25 4
gpt4 key购买 nike

我有一个函数,它接受一个指向指针的指针作为参数。

func(double **arr, int i);

在main函数中数组定义如下:

double arr[][] = //some initialization here;

如何从我的主代码中调用这个函数。我尝试了以下但它给出了一个错误

func (&arr);

不起作用。任何帮助将非常感激。谢谢

最佳答案

arr 的类型是 double[X][Y] - 即 X 数组的 Y double 组 - 其中 XY 取决于您的初始化程序。这与指针类型相同。但是,根据 C 转换规则,数组可以衰减为指向其元素的指针。在您的情况下,这种衰减产生的类型将是 double(*)[Y] - 指向 Y double 组的指针。请注意,这是一个指向数组的指针,而不是一个指针数组,因此它不会进一步衰减。此时,您会遇到类型不匹配,因为您的函数需要 double**

处理此问题的正确方法是将数组视为一维数组,并传递宽度。所以:

void func(double* arr, int w) {
// arr[2][3]
arr[2*w + 3] = ...;
}


double x[6][8] = { ... };
func(&x[0][0], 8);

特别是在 C++ 中,如果您总是有众所周知(但不同)类型的静态分配数组,您可以像这样使用模板和引用:

template <int W, int H>
inline void func(const double (&arr)[W][H]) {
arr[2][3] = ...;
}

double x[6][8] = { ... };
func(x); // W and H are deduced automatically

但是,当您只有一个指针时,这将不起作用(例如,当数组是 new 分配的,并且其大小是在运行时计算的)。对于最一般的情况,您应该改用 C++ 容器。只有标准库,通常使用 vector 的 vector :

#include <vector>

void func(std::vector<std::vector<double> > arr) {
arr[2][3] = ...;
}

std::vector<std::vector<double> > x(6, std::vector<double>(8));
x[0][0] = ...;
...
func(x);

如果你会使用 Boost,它有一个非常好的 MultiArray 库:

void func(boost::multi_array<double, 2> arr) { // 2 means "2-dimensional"
arr[2][3] = ...;
}

boost::multi_array<double, 2> x(boost::extents[6][8]);
x[0][0] = ...;
...
func(x);

[EDIT] 你说你不能改变你的函数的定义。如果是这样,那么它确实是一个将其参数视为指针数组的函数,因此您应该相应地分配您的数据结构。例如:

double x1[8] = { 1, 2, ... };
double x2[8] = { 3, 4, ... };
...
double* x[6] = { x1, x2, ... };

func(x);

关于c++ - 使用 C++ 的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1285457/

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