簡體   English   中英

從C調用Fortran 77

[英]Calling Fortran 77 from C

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

感謝您的幫助

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM