Используются g++ и gfortran (Debian 4.7.2-5)
Программа содержится в main.cpp. В ней создается двухмерный массив типа double:
double A[10][10] = {
{1.0, -6.0, 3.0},
{-7.0, 9.0, -4.0},
{0.0, 4.0, 2.0},
};
Размер 10x10 обусловлен подпрограммой на фортране.
Для вызова подпрограммы из файла foo.f90 используется следующая запись:
extern "C" {
void foo_(..., double(*)[10]);
}
foo_(..., &A);
g++ main.cpp foo.f90 -o test -lgfortran
Надо сказать, что результаты вычислений правильные(их можно перепроверить) и эта конструкция, в целом, работает.
Однако, подобный трюк не проходит с подпрограммами на фортран 77, которые содержатся в файлах *.f. Это подрограммы тоже проверены, и точно правильные. Работа с двумерным массивом не происходит.
Я нашел хороший мануал на эту тему:
http://arnholm.org/software/cppf77/cppf77.htm#Section3.5.2
Здесь есть примеры и для одномерных и для двумерных массивов.
Например:
SUBROUTINE F77SUB(LARR,ARRAY)
INTEGER LARR
REAL ARRAY(LARR)
INTEGER I
C
C Assign values to the array passed from C++
C Note: indices run from 1 to LARR inclusive !
C
DO 1000 I=1,LARR
ARRAY(I) = REAL(I*I)
1000 CONTINUE
RETURN
END
#include <fortran.h>
SUBROUTINE F77SUB(INTEGER& LARR, // integer passed by reference
REAL* ARRAY); // real array pointer passed
void cppfunc()
{
const INTEGER size=10;
REAL ARRAY[size];
INTEGER LARR=size;
.
F77SUB(LARR,ARRAY); // ARRAY == &ARRAY[0]
.
.
// here you can use the assigned contents of ARRAY,
// Note: indices run from 0 to LARR-1 inclusive !
.
.
return;
}
Но совершенно непонятно как компилировать такой код? При попытке сделать
g++ main.cpp f77sub.o -o test
main.cpp:1:21: fatal error: fortran.h: No such file or directory
compilation terminated.
Вопросы:
1. Как откомпилировать программу из примера?
2. Использовать ли cfortran?
3. Использовать ли конструкцию extern"C" в файле main.cpp?
4. Какие еще есть идеи?