Fortran Coder

查看: 10620|回复: 3
打印 上一主题 下一主题

[混编] 关于c_f_pointer的使用

[复制链接]

13

帖子

8

主题

0

精华

入门

F 币
83 元
贡献
51 点
跳转到指定楼层
楼主
发表于 2016-4-11 20:22:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我下面有一段代码,是想c指针转换为fortran指针,然后在c代码那边可以调用fortran的变量的值。代码如下: 我认为我的老师使用的c_f_pointer不对。 我想请教下大家应该如何将数组地址的值传递给 c中的void *addr使用?
  SUBROUTINE calc1_neighbor1(neighbor_addrs,args)
    use ISO_C_BINDING
    IMPLICIT NONE
#include "aceMesh_runtime_f.h"
   type,bind(c) :: ptr_array
       integer :: len
      type(c_ptr) :: addr  !在c中是定义的 void *addr类型
   end
    real(c_double) src,src1
    type(calc1_type1),target :: args
    integer(c_int) ii,jj,size,num
type(ptr_array) ::neighbor_addrs  !派生类型变量
    type(c_ptr),pointer::array(:)  !定义c指针
    size=MAX_NEIGHBORS

   call c_f_pointer(neighbor_addrs%arr,array,[size]) !使用该转换函数使得c指针转换为f指针,然后将array数组指针传递给c代码使用
    ii=args%ii
    jj=args%jj
    num=0
    if(ii+iblock<=M)then
      num=num+1
      array(num)=c_loc(p(ii+iblock,jj))   !获得fortran数组p的地址
    endif

neighbor_addrs%len=num !传递数量num给c使用
    RETURN  
    END SUBROUTINE calc1_neighbor1

我应该如何获得数组的地址,传递给c代码中的void *addr变量使用?并且需要传递计数的num变量给c代码使用?
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
沙发
发表于 2016-4-11 21:24:03 | 只看该作者
看不懂你的代码啊。。。。
你是 C 调用 fortran,还是 fortran 调用 C?

calc1_neighbor1(neighbor_addrs,args)
这里是给 C 调用的?两个参数分别什么含义?

13

帖子

8

主题

0

精华

入门

F 币
83 元
贡献
51 点
板凳
 楼主| 发表于 2016-4-11 21:44:13 | 只看该作者

不想使用c_f_pointer。

我下面有一段代码,是想c指针转换为fortran指针,然后在c代码那边可以调用fortran的变量的值。代码如下: 我认为我的老师使用的c_f_pointer不对。 我想请教下大家应该如何将数组地址的值传递给 c中的void *addr使用。

简单的说是: c调用fortran,在fortran中有数组p需要传递数组每个地址给c代码的结构ptr_array中的void *addr,当addr得到地址后再使用地址进行相应的计算。
我应该如何获得数组p的地址,传递给c代码中的void *addr变量使用?并且需要传递计数的num变量给c代码使用?

neighbor_addrs: type(ptr_array) ::neighbor_addrs  
args: type(calc1_type1),target :: args
calc1_type:
[td]type calc1_type1
     
  integer(c_int) ii,jj
     end type calc1_type1[/td]摘去的部分代码:  
  SUBROUTINE calc1_neighbor1(neighbor_addrs,args)
    use ISO_C_BINDING
    IMPLICIT NONE
#include "aceMesh_runtime_f.h"
   type,bind(c) :: ptr_array
       integer :: len
      type(c_ptr) :: addr  !在c中是定义的 void *addr类型
   end
    real(c_double) src,src1
    type(calc1_type1),target :: args
    integer(c_int) ii,jj,size,num
type(ptr_array) ::neighbor_addrs  !派生类型变量
    type(c_ptr),pointer::array(:)  !定义c指针
    size=MAX_NEIGHBORS

   call c_f_pointer(neighbor_addrs%arr,array,[size]) !使用该转换函数使得c指针转换为f指针,然后将array数组指针传递给c代码使用
    ii=args%ii
    jj=args%jj
    num=0
    if(ii+iblock<=M)then
      num=num+1
      array(num)=c_loc(p(ii+iblock,jj))   !获得fortran数组p的地址
    endif

neighbor_addrs%len=num !传递数量num给c使用
    RETURN  
    END SUBROUTINE calc1_neighbor1


我的想法是将fortran代码中的
type(c_ptr) :: addr(该代码在c中是被定义为void *addr,注释:不能修改c代码),改为 integer(c_int) :: addr(32),
然后   
array(num)=c_loc(p(ii+iblock,jj)) 改为 addr(num)=loc(p(ii+iblock,jj)),不知我的想法如何?

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

地板
发表于 2016-4-11 22:51:24 | 只看该作者
请问lz编译出错还是运行报错?
获得Fortran数组p的地址这行没有看出语法错误啊~数组是连续分配内存的话,只要指针指向某个元素即可,是否数组越界那是另外一个检查
lz老师的用法没发现有问题,gofrtran的手册说得很明白:
If a pointer is a dummy-argument of an interoperable procedure, it usually has to be declared using the VALUE attribute. void* matches TYPE(C_PTR), VALUE, while TYPE(C_PTR) alone matches void**.
Name        Type
C_NULL_PTR        C_PTR
C_NULL_FUNPTR        C_FUNPTR
Both are equivalent to the value NULL in C.
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-11-24 01:55

Powered by Tencent X3.4

© 2013-2024 Tencent

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