Как Fortran возвращает массивы? - PullRequest
2 голосов
/ 19 августа 2010

Подпрограмма Rule_Tn в библиотеке Fortran CUBPACK нуждается в параметре Integrand, описывающем интегрированную векторную функцию.Это

INTERFACE 
   FUNCTION Integrand(NF,X) RESULT(Value)
      USE Precision_Model
      INTEGER,                       INTENT(IN)  :: NF
      REAL(KIND=STND), DIMENSION(:), INTENT(IN)  :: X
      REAL(KIND=STND), DIMENSION(NF)             :: Value
   END FUNCTION Integrand
END INTERFACE

Так как я хочу вызвать Rule_Tn из кода C, мне нужно определить тип функции в C, точно соответствующий этому интерфейсу выше.Таким образом я попытался выяснить, как функция Fortran возвращает массивы.Сначала я предположил, что следующая сигнатура C

void Integrand(double* value, const int* nf, const int* x);

соответствует интерфейсу выше.Но далеко не так!Я получил Segfault.И я уже проверял, что double соответствует типу REAL(KIND=STND), STND выходит из модуля Precision_Model.

Теперь кто-нибудь может сказать мне, какая правильная подпись?Я использую компиляторы GNU Fortran и C.

1 Ответ

1 голос
/ 19 августа 2010

См. Документы GNU .Похоже, вы предоставили аргументы в другом порядке между Fortran и C. Попробуйте поставить value last в прототипе C.

Кроме того, вам не хватает bind(C) в строке FUNCTION.

...