有关于调用Fortran函数和变量的问题需要请教。官方文档的例子不太全,很多地方需要摸索。
现在已有一个Fortran module simplemodule.f95如下:
module simpleModule
implicit none
integer, parameter:: hparam = 10
integer :: h1 = 1
real :: r(2) = [1.0,2.0]
real, allocatable :: s(:)
contains
function foo(x)
integer :: foo, x
foo = x * 2
end function foo
end module simplemodule
编译成动态库:
gfortran simplemodule.f95 -o simplemodule.so -shared -fPIC
使用ccall 调用:
# import integer
a = cglobal((:__simplemodule_MOD_h1, "./simplemodule.so"), Int32)
b = unsafe_load(a)
# import integer array
a = cglobal((:__simplemodule_MOD_r, "./simplemodule.so"), Float32)
# method 1
b = [unsafe_load(a,i) for i in 1:2]
# method 2
b = unsafe_wrap(Array{Float32,1}, a, 2)
都没有问题,但是
# import constant integer error?
a = cglobal((:__simplemodule_MOD_hparam, "./simplemodule.so"), Int32)
则显示找不到该变量。请问Fortran中constant的命名规则是什么?
另外第二个问题,关于allocatable array的调用。如果在Fortran module 中有如下定义的 module variable:
real, allocatable :: s(:)
并且在contains 下添加如下函数:
subroutine init_var
integer :: i
if(.not.allocated(s)) then
allocate(s(10))
else
write(*,*) 's has already been allocated!'
endif
do i=1,10
s(i) = i
enddo
write(*,*) s
end subroutine init_var
subroutine double_var(x)
real, intent(inout):: x(:)
x = x * 2
write(*,*) x
end subroutine double_var
通过如下Julia调用:
ccall((:__simplemodule_MOD_init_var, "./simplemodule.so"), Cvoid, ())
s = cglobal((:__simplemodule_MOD_s, "./simplemodule.so"), Float32)
ccall((:__simplemodule_MOD_double_var, "./simplemodule.so"), Cvoid,
(Ptr{Float64},), s)
可以看到s被正确地分配大小并初始化。而且可以由另外的函数对s进行修改。但是,通过Julia进行调用:
b = unsafe_wrap(Array{Float32,1}, s, 10) # This is not working!
给出的值却并不正确。
不吝赐教!