Fortran Coder

查看: 12217|回复: 6
打印 上一主题 下一主题

[子程序] Fortran 主程序 如何取出 子程序里面的 数组,多谢多谢

[复制链接]

1967

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1372 元
贡献
581 点

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

楼主
发表于 2016-1-12 19:20:30 | 显示全部楼层
子程序和主程序彼此独立,想交换数据,可通过:a. 传递参数  b.使用 common,c. 使用 module(任选其一)
但你的问题,更好的方法是,先获得文件大小,分配以后再读取。不推荐你先用字符串读入,因为 1000 的字符串可能浪费,也可能不够。字符串100的长度也可能浪费,也可能不够。
以下代码使用了一个叫 GetFileN 的函数,这个函数已经写好了,你以后可以直接使用。(更多请参考:http://fcode.cn/code_gen-34-1.html
[Fortran] 纯文本查看 复制代码
Module DFile_Mod
  Implicit None
  
contains 
  
  Integer Function GetFileN( iFileUnit )
    Implicit None
    Integer , Intent( IN ) :: iFileUnit
    character( Len = 1 ) :: cDummy
    integer :: ierr
    GetFileN = 0
    Rewind( iFileUnit )
    Do
      Read( iFileUnit , * , ioStat = ierr ) cDummy
      If( ierr /= 0 ) Exit
      GetFileN = GetFileN + 1
    End Do
    Rewind( iFileUnit )
  End Function GetFileN 

End Module DFile_Mod

Program main
  use DFile_Mod
  Implicit none
  Integer, Allocatable :: elem(:)
  Integer :: N
  Open (11, File='data.txt', Status='old')
  N = GetFileN( 11 )
  Allocate( elem(N) )
  Call assem( 11 , elem )
  Write (*, *) elem
  Deallocate( elem )
  Close( 11 )
contains
  Subroutine assem( FILEID , elem )
    Integer :: elem(:) , FILEID , i
    Do i = 1, size(elem)
      Read ( FILEID , * ) elem(i)
    End Do
  End Subroutine assem
End Program main

1967

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1372 元
贡献
581 点

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

沙发
发表于 2016-1-13 18:19:20 | 显示全部楼层
1.代码中的 module 只是为了避免书写 interface 接口,并无其他用处。不能避免读两次,也不能产生数据共享。
2.你的问题其实是如何读取未知行数的文件,而非“如何在主程序和子程序间共享数据
3.如果你要解决如何在主程序和子程序间共享数据,那么可以使用 : a. 传递参数  b.使用 common,c. 使用 module(任选其一) 不需要使用指针。
4.如果你要解决如何读取未知行数的文件,那么方法1,是使用我的办法,读2次。方法2,是使用指针串表。但这样对数组的访问效率不高。
5.如果您的数据文件,每行的长度是确定的。那么还可以通过文件大小除以每行的长度来获得文件行数。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-6-2 23:50

Powered by Tencent X3.4

© 2013-2024 Tencent

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