Я работаю как с C ++, так и с кодом Fortran. Код C ++ должен вызывать подпрограмму Fortran. Один параметр подпрограммы Fortran имеет тип Fortran complex
,
Код C ++ находится в одном файле, а подпрограмма кода Fortran — в другом файле. я использую gcc
а также gfortran
на 64-битной GNU/Linux
система.
Вот фрагмент, показывающий объявление подпрограммы на Фортране (и несколько дополнительных строк):
SUBROUTINE minp (AMP,L,L2,FMINP,PHI)
REAL*4 AMP( L ),FMINP( L )
COMPLEX PHI( L )
В файле C ++ я понимаю, что аргументы, передаваемые в код Fortran, должны передаваться по ссылке, а не по значению. Подпрограмма Fortran объявлена как функция в коде C ++ (вверху файла исходного кода) с использованием extern
ключевое слово.
extern "C"{
minp_ (float *amp, int &L, int &L2, float *fminp, complex *phi);
}
Однако последний параметр функции представляет собой сложный массив C. Как это возможно:
phi
аргумент?Для сопряжения C (и C ++ через extern C) и Fortran я рекомендую использовать связывание Fortran ISO C. Он предоставляет сложные типы C_FLOAT_COMPLEX, C_DOUBLE_COMPLEX и C_LONG_DOUBLE_COMPLEX, чтобы соответствовать типам Си. Используя связывание ISO C и написав объявление интерфейса Fortran для соответствия коду C, вы проинструктируете компилятор Fortran соответствовать соглашениям о вызовах компилятора C. Если вы используете сложный тип с привязкой ISO C, работа с массивом ничем не отличается от массива float / double / long double. Руководство gfortran содержит примеры в главе «Программирование на разных языках» и описывает типы и внутренние процедуры связывания ISO C в главе «Внутренние модули».
Других решений пока нет …