То, что вы хотите, невозможно в 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);
Теперь у вас есть две возможности:
Используйте C для вашего многомерного массива материала.
Используйте обходной путь C++ для этого.
Самый простой C++ обходной путь будет vector<vector<double> >
. Тем самым вы избегаете хлопот выделения памяти самостоятельно, однако строки в вашей 2D-матрице не являются последовательными.
Вы можете также использовать два слоя косвенность так:
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 работает под капотом с кодом наверху, но со значительно меньшей проверкой типов.
Конечно. Указатель на двойник принципиально не совпадает с 2D-массивом. –
вы передаете указатель на одномерный массив, так как это не может работать так – Hristo
Ваша функция fun принимает двумерный массив удвоений, тогда как вы определяете p как одномерный массив удвоений. Это принципиально неправильно. – therainmaker