Тип arr
- это double[X][Y]
, то есть массив X массивов Y удваивается, где X
и Y
зависят от ваших инициализаторов. Это не то же самое, что тип указателя. Однако, согласно правилам преобразования C, массив может распадаться на указатель на его элемент. В вашем случае тип, полученный в результате такого распада, будет double(*)[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);
person
Pavel Minaev
schedule
16.08.2009