Fortran Coder

C++与Fortran混编 type里值的传递和allocate相关的问题

查看数: 14076 | 评论数: 7 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2017-7-13 19:41

正文摘要:

先贴代码: [Fortran] 纯文本查看 复制代码  module hydromodelUtil     use iso_c_binding     implicit none double precision, parameter :: pi=3.141593d0 !这部分为输入值 &nbs ...

回复

vvt 发表于 2017-7-19 08:11:05
你需要在合适的时机,释放 pointchain 数组。
kyra 发表于 2017-7-14 18:01:23
不需要转换。使用的时候注意顺序即可。
cfortran 发表于 2017-7-14 17:07:51
kyra 发表于 2017-7-14 15:54
在 Fortran 语言里。pointchain 大小是 1:3 * 1:cylinderinfo%pointcount
则 C 语言中正好相反,所以应该视 ...

真的是这样啊。。。数据都对,好厉害。

我这个程序其实是一个中间程序,是一个划分网格的程序,也就是说这里面的所有数据都需要导出来

这样看来我需要再做一个函数进行转化一下对吗

顺便问一下这个数据转换有相关的资料吗   我想学习一下
cfortran 发表于 2017-7-14 15:37:48
kyra 发表于 2017-7-14 08:12
问题1,无需额外处理。
问题2,不能在type里存放fortran语言的动态分配数组。否则C语言无法用标准化的手段 ...

这里最后一行代码,假如想输出
[Fortran] 纯文本查看 复制代码
  module hydromodelUtil
    use iso_c_binding
    implicit none
double precision, parameter :: pi=3.141593d0

!这部分为输入值
    type ,Bind(C)::unitinfo
      integer(c_int) :: controlno
      character(c_char) :: unitname
      integer(c_int) :: unittype
      integer(c_int) :: solid
      real (c_double):: coearea
      real(c_double) ,dimension(3) :: shapepara
      integer(c_int):: pn=0
      double precision, dimension(:,:), allocatable :: plist
      real(c_double), dimension(3) :: rotationpara, tranpara
end type unitinfo

!这部分为输出值
    type ,Bind(C):: singleinfo
      integer(c_int) :: controlno 
      integer(c_int) :: unittype
      integer(c_int) :: solid
      real(c_double) :: coearea
      real(c_double):: volume
      real(c_double), dimension(3) :: center 
      integer (c_int):: pointcount, trianglecount 
      double precision, dimension(:,:), allocatable :: pointchain 
      double precision, dimension(:,:,:), allocatable :: trianglechain
    end type singleinfo
  
    contains
 subroutine cylindermeshing(r, h, cylinderinfo) Bind(C,Name="cylindermeshing")
    !DEC$ ATTRIBUTES DLLEXPORT::cylindermeshing 
    implicit none
    real(c_double) :: r, h
    type(singleinfo) :: cylinderinfo
    integer(c_int) :: polyedge=60
double precision, dimension(:,:), allocatable :: point
    real(c_double) :: dtheta
    integer(c_int) :: meshi
    
    dtheta=2*pi/real(polyedge) 

    cylinderinfo%volume=(0.5d0*polyedge*sin(dtheta)*r**2)*h
    cylinderinfo%center=(/ 0.0d0, 0.0d0, 0.5d0*h /)
    cylinderinfo%pointcount=2*polyedge
    cylinderinfo%trianglecount=4*polyedge 
    allocate(point(2,polyedge+1) )
    allocate(cylinderinfo%pointchain(3,cylinderinfo%pointcount) )
    
    do meshi=1, polyedge, 1
        point(1,meshi)=r*cos( (real(meshi)-1.0d0)*dtheta) 
        point(2,meshi)=r*sin( (real(meshi)-1.0d0)*dtheta) 
    end do
    point(:, polyedge+1)=point(:, 1) 
    
    do meshi=1, polyedge, 1
        cylinderinfo%pointchain(1:2,meshi)=point(1:2,meshi)
        cylinderinfo%pointchain(3,meshi)=0.0d0
        cylinderinfo%pointchain(1:2,polyedge+meshi)=point(1:2,meshi)
        cylinderinfo%pointchain(3,polyedge+meshi)=h
    end do
    end subroutine cylindermeshing
end module hydromodelUtil
传递过来的数据,该怎么处理啊  我试了一下传递过来的数据明显不对啊
kyra 发表于 2017-7-14 08:12:15
本帖最后由 kyra 于 2017-7-14 08:20 编辑

问题1,无需额外处理。
问题2,不能在type里存放fortran语言的动态分配数组。否则C语言无法用标准化的手段访问。解决办法是,用 C 指针,fortran分配后把地址赋给 C 指针。具体看注释

(这方法适合于fortran的动态分配返回给 C,并不适合 C 分配的数组传递给 fortran)

[Fortran] 纯文本查看 复制代码
real(c_double),dimension(:,:),allocatable,target,save::point


[C++] 纯文本查看 复制代码
cout<<cylinderinfo.pointchain[2][6]<<endl;

kyra 发表于 2017-7-13 19:42:00
在 Fortran 语言里。pointchain 大小是 1:3 * 1:cylinderinfo%pointcount
则 C 语言中正好相反,所以应该视为 0:cylinderinfo%pointcount-1 * 0:2

因此 fortran 中 pointchain(2,6) = 381 ,则 C 中应该输出 cout << cylinderinfo.pointchain[ (6-1)*3+(2-1) ]

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-11-23 22:19

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表