[英]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
(由bind
的name
子句覆蓋)。 使用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.