1

我在 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

感谢您的帮助

4

1 回答 1

3

Fortran 的调用约定与 C 几乎相同,但有以下区别:

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

例如,如果你有一个 fortran 例程

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

于 2010-09-16T10:51:06.047 回答