簡體   English   中英

無法將數組從FORTRAN傳遞到C.

[英]Unable to pass array from FORTRAN to C

我試圖將一個維度數組從FORTRAN程序傳遞給C.

調用C函數,但它保存的值是垃圾。 但是,如果我嘗試使用整數變量調用相同的函數,我可以傳遞所需的值。 任何人都可以幫我解決這個問題嗎?

我使用的代碼與此類似

文件:fortran_prog.f

program test
    real*4 :: a(4)
    data a / 1,2,3,4 /
    call test_func(a)
end program test

文件:c_prog.c

int test_func(double a[]) {
    int i;

    for(i=0;i<4;i++) {
        printf("%f\n",a[i]);
    }

    return 0;
}
program test_Cfunc

   use iso_c_binding
   implicit none

   interface
      function test_func (a) bind (C, name="test_func")
         import
         integer (c_int) :: test_func
         real (c_double), dimension (1:4), intent (in) :: a
      end function test_func
   end interface

   real (c_double), dimension (1:4) :: a = [ 2.3, 3.4, 4.5, 5.6 ]
   integer (c_int) :: result

   result = test_func (a)
   write (*, *) result

end program test_Cfunc

使用Fortran的ISO C綁定,該解決方案可以移植到同一供應商的成對編譯器,或Fortran編譯器供應商支持的組合。 您不必了解特定編譯器的傳遞約定,也不必處理Fortran編譯器的name (由bindname子句覆蓋)。 使用interface塊描述Fortran的C例程,使用ISO C Binding中指定的Fortran類值指定C類型。 “內部模塊”一章中的gfortran手冊中列出了各種類型。 另請參閱“混合語言編程”一章。 由於ISO C Binding是語言標准的一部分,因此這個文檔比gfortran更通用。

在Fortran和C之間傳遞數組是一個非常重要的問題。 特定的C和Fortran編譯器很重要。

我看到的第一個問題是你指定double來匹配real*4 這幾乎在所有平台上都無效。 將C函數聲明為:

int test_func (float *a)

這可能適用於某些平台,盡管許多Fortran編譯器傳遞“數組描述符”的地址而不是數組本身。 查看Fortran編譯器的文檔。

暫無
暫無

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

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