fortron使用经验

C# 调用 Fortron 的 dll

经验:

  1. 需要在导出函数的地方标记函数名
    !DEC$ ATTRIBUTES DLLEXPORT::AAAA
    !DEC$ ATTRIBUTES VALUE:: nt, ms, nv, nf
  1. 需要在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 的动态库

  1. 注意函数声明形式,只要一行生成即可。
!DEC$ ATTRIBUTES DLLEXPORT::test1
  1. 引用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 的引用。

posted @ 2023-05-29 09:45  lvye1221  阅读(26)  评论(0编辑  收藏  举报