fortron使用经验
C# 调用 Fortron 的 dll
经验:
- 需要在导出函数的地方标记函数名
!DEC$ ATTRIBUTES DLLEXPORT::AAAA
!DEC$ ATTRIBUTES VALUE:: nt, ms, nv, nf
- 需要在C#端,定义函数声明,注意名称为大写
设置fortron dll 的输出名称
dll 导出接口
subroutine AAAA(nt, ms, nv, nf, parm, pdat, dist, vfiso)
implicit none
!DEC$ ATTRIBUTES DLLEXPORT::AAAA
!DEC$ ATTRIBUTES VALUE:: nt, ms, nv, nf
integer:: nt, ms, mp, nv, nf, kflank, i, j, k
real :: pdat(nt*ms), dist(nt), parm(10), vfiso(nv*nf), vmin, fmax, dv, dt, df
! 代码注释
!nt=ntrace, ms=msamp,
dt=parm(1); dv=parm(2); df=parm(3); vmin=parm(4)
fmax=parm(5); kflank=parm(6)
end subroutine
Fortron 调用 Fortron 的动态库
- 注意函数声明形式,只要一行生成即可。
!DEC$ ATTRIBUTES DLLEXPORT::test1
- 引用lib,并将生成 dll 文件复制到 exe 同级目录下。
定义 fortron 工程
Subroutine test1(m,n,a)
implicit none
!DEC$ ATTRIBUTES DLLEXPORT::test1
integer :: m, n, i, j
real*8 :: a(m,n)
do i=1,m
do j=1,n
a(i,j) = i + j
end do
end do
!m=3; n=4
print *, m, n
do i=1,m
print *, (a(i,j), j=1,n)
end do
end subroutine
调用 Fortron Dll 端
program main
implicit none
integer :: m, n, i, j, k
real*8 :: a(3,4), b(12)
data ((a(i,j),j=1,4),i=1,3)/ 11., 12., 13., 14., &
21., 22., 23., 24., &
31., 32., 33., 34./
m=3; n=4
do i=1,m
print '(4f10.2)', (a(i,j), j=1,n)
end do
print *
do i=1,m
do j=1,n
k=(i-1)*n+j; b(k)=a(i,j)
end do
end do
call test1(m,n,a)
!k=m*n; call test2(k,b)
do i=1,m
print *, (a(i,j), j=1,n)
end do
end
关键在于 call test1(m,n,a)。
设置 dll 的引用。