簡體   English   中英

從 C 包裝器調用 FORTRAN 函數

[英]Calling FORTRAN function from C wrapper

我是新手,但我需要從 C 訪問一些舊的 Fortran 77 函數。如果可能,我不想更改 Fortran 代碼,我真的更喜歡編寫一個包裝器來從 C 調用 Fortran 函數。我希望得到一個最小的工作示例(在 Linux 上)。 我做了什么:

在文件 somefunction.f 中:

REAL*8 FUNCTION MYFUNC(ZZ)
      IMPLICIT NONE
      REAL*8 ZZ, T1
      T1 = ZZ + 1.0D0
      MYFUNC = T1
      RETURN
      END

gfortran -c somefunction.f -o somefunction.o

在文件 debug.c 中:

#include <stdio.h>

double cfunc(double x) {
    double result = myfunc_( &x );
    return result;
}
int main() {
    double test = cfunc(3.0);
    printf(" %.15f ",test);
}

使用gcc -c debug.c -o debug.o

然后我給gcc debug.o somefunction.o./a.out

然而,我得到的不是 3+1=4,而是無意義的數字。 我該如何糾正?


PS:如果這樣解決了,我的實際功能就復雜一點了:

  1. 如果 MYFUNC 不是COMPLEX*16 FUNCTION MYFUNC(ZZ) ,而 ZZ 也是一個復雜類型,我應該改變什么?

  2. 如果 MYFUNC 調用一些內置的 Fortran 函數,比如 CDLOG(ZZ) 呢?

  3. 如果它訪問一個公共塊呢? 這也能容納嗎?

除了返回類型之外,您還需要注意 Fortran 過程名稱被重整為您從 C 訪問的符號的方式。沒有標准,它完全取決於 Fortran 編譯器和平台,因此您將有如果您想要可移植性,可以使用一些配置時間檢測和宏。

例如,需要從 C 調用 Fortran MYFUNC()為:

  • Windows 上 Intel Fortran 下的MYFUNC()
  • IBM XL Fortran ( xlf ) 下的myfunc() )
  • myfunc_()在大多數其他情況下(包括 Windows 上的 GNU Fortran)

(當 Fortran 例程在模塊中時,情況會變得更加復雜,因為損壞的名稱以模塊和_MOD__mp_等為前綴。)

現代 Fortran 解決方案是在 Fortran 端聲明一個bind(C)例程,這會關閉此重整(或者您可以指定顯式綁定名稱)。

好的,僅供參考,正如@IanBush所說,C程序應該已經聲明了myfunc的返回類型,

#include <stdio.h>

double myfunc_(double*);

double cfunc(double x) {
    double result = myfunc_( &x );
    return result;
}
int main() {
     double test = cfunc(3.0);
     printf(" %.15f ",test);
}

暫無
暫無

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

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