Вызов Фортран 77 из C - PullRequest
       6

Вызов Фортран 77 из C

1 голос
/ 16 сентября 2010

У меня есть функция ema в фортране 77. Как мне вызвать функцию фортрана из C. Я знаю, что в фортране 2003 есть iso_c_bindings, но мне нужно какое-то решение для старого стандарта 77.

subroutine ema(inarray,leninarray,n,outarray,lenoutarray)

integer leninarray, lenoutarray, n, i
double precision inarray(leninarray), outarray(lenoutarray)

do 10 i = n+1, leninarray
    outarray = inarray(i) * (1/n) + outarray(i-1) * (1-(1/n))

continue
end

Спасибо за любую помощь С уважением

1 Ответ

3 голосов
/ 16 сентября 2010

Fortran имеет почти то же соглашение о вызовах, что и C, но со следующими отличиями:

  • Все передается по ссылке: вам нужно передать address в процедуру fortran
  • Порядок аргументов одинаков (выталкивается справа налево)
  • Адрес возвращаемого значения необходимо помещать в стек после аргументов при вызове функции fortran (нефортран подпрограммы).В соответствующем прототипе C это равносильно объявлению функции void и дополнительному аргументу first , который является указателем на возвращаемое значение.
  • Иногда вам необходимо добавить дополнительное подчеркиваниена имя Фортрана.Это требует некоторых экспериментов.

Например, если у вас есть рутина фортрана

subroutine ema(inarray,leninarray,n,outarray,lenoutarray)

она превращается в

void ema(double*, int*, int*, double*, int*)

или

void ema_(double*, int*, int*, double*, int*)

в зависимости от вашей машины.В C ++ вы хотите

extern "C" void ema(double*, int*, int*, double*, int*)

или

extern "C" void ema_(double*, int*, int*, double*, int*)

Не забывайте, что массивы fortran начинаются с 1, когда вы передаете индексы в подпрограммы.

...