Fortran Coder

查看: 11051|回复: 4
打印 上一主题 下一主题

[派生类型] 如何实现一个数据结构的共享(不同文件中)

[复制链接]

9

帖子

2

主题

0

精华

入门

F 币
53 元
贡献
29 点
跳转到指定楼层
楼主
发表于 2016-9-2 18:02:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1F 币
本人刚接触fortran不就,请教大家个问题:!======================================
我自己定义了一个数据结构,比如:

    type  tttt
        integer:: num
        character(len=15) :: name1
    end type tttt


然后我希望在主程序中使用该结构,比如:

program hello

   !!下面两行会出错,因为tttt没有定义
    type(tttt),pointer::ps
    type(tttt),target :: s

    s%num=1
    s%name1="wangwei"
    ps=>s

   !!!我还想对结构体指针利用过程重新赋值,代码如下
   call mod_struct(ps)

end  program hello

子过程如下:
subroutine  mod_struct(struct)
        type(tttt),pointer:: struct
        struct%name1="xie"
end

!====================================
中间会牵涉到这么几个知识点,我不太明白:

1)如何将定义的结构体,比如保存到头文件里,随时可以使用?即全局变量和共享数据结构的问题。
2)假如第一步成功了,我的mod_struct对不对?
     我曾把结构体的定义放到  program和sunroutine里,这样编译是能过去的,胆汁性会有segment fault。
    原因大概是指针没有指到实体,所以报错了。我怎样改才可以?










最佳答案

查看完整内容

传递指针的话,需要用 interface,而书写到 module 里,可以避免手动书写 interface [mw_shl_code=fortran,true]module typedef Implicit None type tttt integer:: num character(len=15) :: name1 end type tttt end module typedef module mod_struct_mod use typedef Implicit None contains subroutine mod_struct(struct) type(tttt),pointer:: struct struct%name1="xie" end subroutine ...
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

1958

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1339 元
贡献
565 点

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

沙发
发表于 2016-9-2 18:02:04 | 只看该作者
传递指针的话,需要用 interface,而书写到 module 里,可以避免手动书写 interface

[Fortran] 纯文本查看 复制代码
module typedef
  Implicit None
  type  tttt
    integer:: num
    character(len=15) :: name1
  end type tttt
end module typedef

module mod_struct_mod
  use typedef
  Implicit None
contains
  subroutine  mod_struct(struct)
    type(tttt),pointer:: struct
    struct%name1="xie"
  end subroutine mod_struct  
end module mod_struct_mod

program hello
  use mod_struct_mod
  type(tttt),pointer::ps
  type(tttt),target :: s
  s%num=1
  s%name1="wangwei"
  ps=>s
  call mod_struct(ps)
  write(*,*) ps
end program hello
回复

使用道具 举报

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

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

QQ
板凳
发表于 2016-9-2 19:34:04 | 只看该作者
本帖最后由 vvt 于 2016-9-2 19:35 编辑

定义在 module 里就可以了。然后两个程序都 use 这个 module

[Fortran] 纯文本查看 复制代码
module typedef
  type  tttt
         integer:: num
         character(len=15) :: name1
     end type tttt
end module typedef

program hello
use typedef
    type(tttt),pointer::ps
     type(tttt),target :: s

     s%num=1
     s%name1="wangwei"
     ps=>s

    !!!我还想对结构体指针利用过程重新赋值,代码如下
   call mod_struct(ps)

 end  program hello

subroutine  mod_struct(struct)
use typedef
         type(tttt),pointer:: struct
         struct%name1="xie"
 end
回复

使用道具 举报

9

帖子

2

主题

0

精华

入门

F 币
53 元
贡献
29 点
地板
 楼主| 发表于 2016-9-5 08:44:51 | 只看该作者
vvt 发表于 2016-9-2 19:34
定义在 module 里就可以了。然后两个程序都 use 这个 module

[mw_shl_code=fortran,true]module typedef

谢谢!第一个问题已经解决l了,第二个问题是因为struct在mod_struct里只是声明个指针,没有明确的target,所以在用的时候报The procedure has a dummy argument that has the ALLOCATABLE, ASYNCHRONOUS, OPTIONAL, POINTER, TARGET, VALUE or VOLATILE attribute
警告或错误,其实struct只是实参,当如何修改就会使这个错误消失呢?
回复

使用道具 举报

9

帖子

2

主题

0

精华

入门

F 币
53 元
贡献
29 点
5#
 楼主| 发表于 2016-9-7 19:36:43 | 只看该作者
fcode 发表于 2016-9-5 09:01
传递指针的话,需要用 interface,而书写到 module 里,可以避免手动书写 interface

[mw_shl_code=fortran ...

谢谢帮助!已经解决!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 20:57

Powered by Tencent X3.4

© 2013-2024 Tencent

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