Fortran Coder

查看: 243|回复: 4

[混编] 各位大拿,如何给FORTRAN变量指定地址

[复制链接]

13

帖子

3

主题

0

精华

入门

F 币
70 元
贡献
36 点
发表于 2017-12-12 23:43:59 | 显示全部楼层 |阅读模式
FORTRAN调用C中函数获得平台上某个变量地址,如 F_ogd_pointer=GETVAR("testvar")
这个地址要指定给FORTRAN中某个变量,现在用的是:
        integer*4 :: F_ogd      
        pointer(F_ogd_pointer,F_ogd)
我也不知道pointer用法怎么来的,但IVF认。
现在的问题是在C中testvar变量地址是3101D675,FORTRAN中F_ogd_pointer打印出的值是822204021,转为了10进制。
平台testvar=10,但F_ogd=0,地址这块没对上?

代码
[Fortran] 纯文本查看 复制代码
subroutine F_TEST1
        integer :: x=5,y=5,i=0
        real*4 ::z
        integer*4 :: F_ogd      
        pointer(F_ogd_pointer,F_ogd)

        INTERFACE
           integer*4 FUNCTION GETVAR(VarName) BIND(C,NAME="getvar_fun")
                USE,INTRINSIC :: ISO_C_BINDING  
                CHARACTER(KIND=C_CHAR),DIMENSION(*)::VarName
            END FUNCTION GETVAR   
        END INTERFACE

        F_ogd_pointer=GETVAR("testvar")
!         F_ogd=5
!        z=LOC(F_ogd)
        WRITE (*,*) F_ogd
!        WRITE (*,*) z
        WRITE (*,*) F_ogd_pointer
end 
回复

使用道具 举报

13

帖子

3

主题

0

精华

入门

F 币
70 元
贡献
36 点
 楼主| 发表于 2017-12-12 23:48:26 | 显示全部楼层
FORTRAN指针本质是引用,对上面的pointer用法好奇,书上好像没有,IVF专用?

443

帖子

2

主题

0

精华

大宗师

F 币
2977 元
贡献
1772 点

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

发表于 2017-12-13 09:07:54 | 显示全部楼层
sansu 发表于 2017-12-12 23:48
FORTRAN指针本质是引用,对上面的pointer用法好奇,书上好像没有,IVF专用?

Cray pointer
https://gcc.gnu.org/onlinedocs/g ... .html#Cray-pointers
Cray公司在超算领域可是风光好一阵子,国防科大的银河1、银河2都是Cray计算机的逆向工程产品
超级计算机之父--克雷
http://blog.sciencenet.cn/blog-219583-562755.html

1237

帖子

12

主题

5

精华

论坛跑堂

Fcode跑堂伙计

F 币
790 元
贡献
357 点

新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2017-12-13 09:29:35 | 显示全部楼层
内存里都是二进制的,但一般我们输出和查看时,用二进制就很不方便。

对于内存地址,输出通常用十六进制。
对于数值类型,输出通常用十进制(方便人类理解)

不管你用几进制,内存里都是一样的,都是二进制转换来的。

[Fortran] 纯文本查看 复制代码
subroutine F_TEST1
  use , intrinsic :: ISO_C_Binding !//使用标准C接口模块
  implicit none
  integer :: x=5,y=5,i=0
  real*4 ::z
  integer*4 , pointer :: F_ogd   !// fortran 指针
  !//pointer(F_ogd_pointer,F_ogd) 这句删掉,是IVF的扩展语法

  INTERFACE
    type(C_PTR) FUNCTION GETVAR(VarName) BIND(C,NAME="getvar_fun") !//用 c_ptr 返回 C 指针
      USE,INTRINSIC :: ISO_C_BINDING
      CHARACTER(KIND=C_CHAR),DIMENSION(*)::VarName
    END FUNCTION GETVAR
  END INTERFACE

  call c_f_pointer( GETVAR("testvar") , F_ogd ) !// 用 c_f_pointer 转换 fortran 指针
  WRITE (*,*) F_ogd
end

13

帖子

3

主题

0

精华

入门

F 币
70 元
贡献
36 点
 楼主| 发表于 2017-12-16 21:12:46 | 显示全部楼层
fcode 发表于 2017-12-13 09:29
内存里都是二进制的,但一般我们输出和查看时,用二进制就很不方便。

对于内存地址,输出通常用十六进制。 ...

多谢多谢
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2018-7-22 13:02

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

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