从C调用Fortran 77

时间:2010-09-16 10:45:52

标签: c fortran77

我在fortran 77中有一个ema函数。我如何从C调用fortran函数。我知道在fortran 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 个答案:

答案 0 :(得分:3)

Fortran与C的调用约定几乎相同,但有以下不同之处:

  • 所有内容都通过引用传递:您需要将地址传递给fortran例程
  • 参数的顺序相同(从右向左推)
  • 在调用fortran函数(而不是fortran子例程)时,需要在参数之后将返回值的地址压入堆栈。在相应的C原型中,这相当于声明函数void,并且有一个额外的 first 参数,它是一个指向返回值的指针。
  • 有时,您需要在fortran名称附加额外的下划线。这需要一些实验。

E.g。如果你有一个强奸例程

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开始。