Я пытаюсь передать многомерный массив Fortran в программу на C++ в программе взаимодействия C++ Fortran. У меня есть общее представление о том, как передаются массивы из Fortran в C++; вы передаете местоположение массива из Fortran в C++. Тогда C++ берет сплющенный массив, и вам нужно сделать некоторый алгебраический расчет, чтобы найти элемент в заданном многомерном массиве.Многомерный массив Fortran в C++
Я смог успешно протестировать эту идею на скалярном массиве. Не так сложно вычислить индекс элемента в C++, потому что он линейно отображен из индекса Fortran в C++ со смещением -1. Примеры кодов для Fortran и C++ являются:
! Fortran main program
program fprogram
integer :: i
real*8 :: array(2)
array(1) = 1.0
array(2) = 2.0
! call cpp function
call cppfuncarray(array, 2)
write(*,*) array
end program
//cpp file
extern "C" {
void cppfuncarray_(double *array, int *imax);}
void cppfuncarray_(double *array, int *imax) {
int iMax = *imax;
for (int i = 0; i < iMax; i++) {
array[i] = array + 1.0*i;
}
};
и на выходе будет массив (1) = 1 и матрицы (2) = 3. Теперь я пытаюсь передать многомерные массивы, такие как A (2 , 2) или A (2,3,2) от Fortran до C++. Я знаю, что 2-мерный массив, такой как A (2,2), будет легко определить сплющенный массив в C++. Но я считаю, что было бы немного сложнее найти элементы на C++ для 3 или 4-мерных массивов.
Каков правильный способ построения многомерного массива в C++, чтобы я мог ссылаться на элементы в массиве A (k, j, i) в Fortran как A [i] [j] [k] в C++?
Заранее благодарен!
Как я могу видеть простой способ передать его как один дайсианальный массив (как в вашем примере).Вы можете получить доступ к элементам типа '' array [j * n + i] '', где '' i'' и '' j'' являются индексами, '' n'' - количеством строк. (Это не '' array [i * m + j] '', где '' m'' - количество столбцов, потому что в многомерных массивах Fortran, хранящихся в основном порядке столбца). Вы также можете обобщить его на 3 или более измерений. – NikolayKondratyev
Какой компилятор Fortran вы используете? Например, с помощью текущего gfortran вы можете (в зависимости от версии Fortran вашего источника) найти, что массивы представлены как нечто более сложное, чем вы ожидаете. Подробности см. В файле gcc_ARRAY_DESCRIPTOR в файле libgfortran.h в источниках gcc. – bg2b
Я действительно думал о чем-то более элегантном, а не просто прост. Я думаю, что просто просто использовать основной порядок узлов для поиска элементов в многомерных массивах, но это не всегда самая увлекательная структура. Если мне кажется, что я не смогу найти более приятную структуру, я, вероятно, буду придерживаться того, что работает лучше всего. –