Fortran Coder

查看: 18969|回复: 18
打印 上一主题 下一主题

[面向对象] 一个关于无类型指针的问题

[复制链接]

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

楼主
发表于 2019-7-3 18:10:28 | 显示全部楼层
class(*) 有挺多妙用的呀。
对于一些函数里不对输入数据进行操作,直接传递出去的,都可以用它。

我写过一个转换大小端的程序,用了 class(*) 之后,我就不需要为 real4 , real8 , real16 , integer2, integer4 , integer8 分别写一次了。

[Fortran] 纯文本查看 复制代码
program main
  implicit none
  Integer :: a
  Real :: b
  a = 3
  b = 1.0
  write(*,'("0x",z8.8)') a
  call CnvrtEndian( a , 4 )
  write(*,'("0x",z8.8)') a
  write(*,'("0x",z8.8)') b
  call CnvrtEndian( b , 4 )
  write(*,'("0x",z8.8)') b
contains

  Subroutine CnvrtEndian( byteIn , nByte )
    use , intrinsic :: ISO_C_Binding
    class(*) , target , Intent(INOUT) :: byteIn
    integer  , Intent(IN)             :: nByte
    character , pointer :: p(:)
    call c_f_pointer( c_loc(byteIn) , p , [nByte] )
    p = p(nByte:1:-1)
  End Subroutine CnvrtEndian
  
end program main

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2019-7-4 08:46:11 | 显示全部楼层
fortran语法设计得比较严谨,不确切的、可能因疏忽导致莫名其妙错误的,都被严格禁止了。

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

板凳
发表于 2019-7-4 11:21:48 | 显示全部楼层
gfortran的 c_loc 不支持多态的话,可能就麻烦点,得用不规范的 loc

  Subroutine CnvrtEndian( byteIn , nByte )
    use , intrinsic :: ISO_C_Binding
    class(*) , target , Intent(INOUT) :: byteIn
    integer  , Intent(IN)             :: nByte
    character , pointer :: p(:)
    type(c_ptr) :: cp
    cp = transfer( loc(byteIn) , cp )
    call c_f_pointer( cp , p , [nByte] )
    p = p(nByte:1:-1)
  End Subroutine CnvrtEndian

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

地板
发表于 2019-7-4 17:39:54 | 显示全部楼层
差不多是这样。fortran语法太严苛,保证安全的同时,也有失灵活。
大多数时候,没必要这么做。
一部分过程,如果传入类型不重要,只是单纯的做别的事情,把传入参数直接传走,可以考虑用class(*)
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-5 13:24

Powered by Tencent X3.4

© 2013-2024 Tencent

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