Передача массива комплексных чисел между C ++ и кодом Fortran

Я работаю как с 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. Как это возможно:

  1. Выделите память для сложного массива в C / C ++ для передачи в качестве phi аргумент?
  2. Передать массив в качестве аргумента подпрограмме Fortran таким образом, чтобы память могла использоваться кодом Fortran?

1

Решение

Для сопряжения 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 в главе «Внутренние модули».

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector