Тип arr
является double[X][Y]
- то есть, массив X массивов Y удваивается - где X
и Y
зависит от ваших инициализаторах. Это не так же, как тип указателя. Однако, согласно правилам преобразования C, массив может распадаться на указатель на его элемент. В вашем случае тип, возникающий в результате такого распада, будет двойным (*) [Y] - указателем на массив из Y двойников. Обратите внимание, что это указатель на массив, а не на массив указателей, поэтому он больше не будет распадаться. На данный момент вы получаете несоответствие типа, так как ваша функция ожидает 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++.Со стандартной библиотеки только один обычно использует вектор векторов:
#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);
Итак, как мне передать массив моей функции? Я запутался. Я хочу передать его func без изменения его декларации. – zack