Fortran Coder

查看: 12757|回复: 9
打印 上一主题 下一主题

[子程序] 子程序 调用

[复制链接]

33

帖子

4

主题

0

精华

熟手

F 币
229 元
贡献
117 点
跳转到指定楼层
楼主
发表于 2014-4-2 13:24:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
在GFortran中写的代码。
刚开始想用子程序,后来发现不会,于是就没有用。运行正常,结果正确。【no_sub.f90文件】

后改为子程序,无法完成编译。如图【sub.f90文件】


mark_han.rar (1.19 KB, 下载次数: 2)


分享到:  微信微信
收藏收藏1 点赞点赞 点踩点踩

33

帖子

4

主题

0

精华

熟手

F 币
229 元
贡献
117 点
沙发
 楼主| 发表于 2014-4-2 13:26:04 | 只看该作者
压缩包含两个源代码文件及所需输入文件。

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

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

板凳
发表于 2014-4-2 13:34:07 | 只看该作者
你得把 L 等数组传递到子程序中。并且定义这些数组

[Fortran] 纯文本查看 复制代码
!计算抛物线运动的程序,P162(彭国伦)
!==================================================
PROGRAM SOLVE
	IMPLICIT NONE
	REAL::L(5),VELOCITY(5),ALPHA(5)
	CALL READ_VELOCITY( Velocity )
	CALL READ_ALPHA( Alpha )
	CALL RESULTS( L,Velocity , Alpha )
END
!==================================================
!==================================================
 SUBROUTINE READ_VELOCITY( Velocity )
  real :: velocity(5)
	!从文件读入速度数据
	OPEN(UNIT=9,FILE='VELOCITY.txt')
	READ(9,*)VELOCITY
	CLOSE(9)
	RETURN
 END SUBROUTINE 
!==================================================
!==================================================
 SUBROUTINE READ_ALPHA( Alpha )
  Real :: alpha(5)
	!从文件读入角度数据
	OPEN(UNIT=9,FILE='ALPHA.txt')
	READ(9,*)ALPHA
	CLOSE(9)
	RETURN
 END SUBROUTINE 
!==================================================
!==================================================
 SUBROUTINE RESULTS( L , Velocity , Alpha )
	!进行计算——投掷距离
  REAL,PARAMETER::PI=3.14159,G=9.81
	REAL::L(5),VELOCITY(5),ALPHA(5)
	 FORALL (I=1:5:1) 
	   L(I)=(VELOCITY(I))**2*SIN(2*(ALPHA(I)*PI/180))/G
	 ENDFORALL
	!结果输出到文件
	OPEN(UNIT=0,FILE='RESULTS_1.TXT')
	WRITE(0,'(/,5X,F7.2)')L
	RETURN
 END SUBROUTINE 
!==================================================




33

帖子

4

主题

0

精华

熟手

F 币
229 元
贡献
117 点
地板
 楼主| 发表于 2014-4-2 13:48:29 | 只看该作者
fcode 发表于 2014-4-2 13:34
你得把 L 等数组传递到子程序中。并且定义这些数组

不行啊,提示Warning: The FORALL with index 'i' is not used on the left side of the assignment at (1) and so might cause multiple assignment to this object

如果每个数组名后面都跟上(i)就提示Error: Unexpected STATEMENT FUNCTION statement in FORALL block at (1)【在/180处】

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

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

5#
发表于 2014-4-2 13:49:27 | 只看该作者
我已把正确的代码贴在上面。

33

帖子

4

主题

0

精华

熟手

F 币
229 元
贡献
117 点
6#
 楼主| 发表于 2014-4-2 13:58:35 | 只看该作者
fcode 发表于 2014-4-2 13:49
我已把正确的代码贴在上面。

多谢管理员大人。看来子程序确实是个好东东哇。

再问一下我原先那个“common 数组”没有这样的结构吗?

736

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
700 元
贡献
359 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

7#
发表于 2014-4-2 14:03:28 | 只看该作者
目前来说,common 建议不要使用了。永远不要使用。

实际上,子程序是个很好玩的东西。就你的例子来说,完全可以把 READ_VELOCITY 和 READ_ALPHA 写成同一个函数。比如 Read_Data

[Fortran] 纯文本查看 复制代码
!计算抛物线运动的程序,P162(彭国伦)
!==================================================
PROGRAM SOLVE
	IMPLICIT NONE
	REAL::L(5),VELOCITY(5),ALPHA(5)
	CALL READ_Data( "velocity.txt" , Velocity )  
	CALL READ_Data( "Alpha.txt" , Alpha )
	CALL RESULTS( L,Velocity , Alpha )
END
!==================================================
!==================================================
 SUBROUTINE READ_Data( cFile , r )
   character( len = * ) :: cFile
   real :: r(5)
	!从文件读入速度数据
	OPEN(9,FILE=cFile)
	READ(9,*)r
	CLOSE(9)
	RETURN
 END SUBROUTINE 
!==================================================
!==================================================
 SUBROUTINE RESULTS( L , Velocity , Alpha )
	!进行计算——投掷距离
  REAL,PARAMETER::PI=3.14159,G=9.81
	REAL::L(5),VELOCITY(5),ALPHA(5)
	 FORALL (I=1:5:1) 
	   L(I)=(VELOCITY(I))**2*SIN(2*(ALPHA(I)*PI/180))/G
	 ENDFORALL
	!结果输出到文件
	OPEN(UNIT=0,FILE='RESULTS_1.TXT')
	WRITE(0,'(/,5X,F7.2)')L
	RETURN
 END SUBROUTINE 
!==================================================

33

帖子

4

主题

0

精华

熟手

F 币
229 元
贡献
117 点
8#
 楼主| 发表于 2014-4-2 14:08:39 | 只看该作者
chuxf 发表于 2014-4-2 14:03
目前来说,common 建议不要使用了。永远不要使用。

实际上,子程序是个很好玩的东西。就你的例子来说,完 ...

谢谢指导。
这个代码我得好好消化一阵。谢谢您

736

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
700 元
贡献
359 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

9#
发表于 2014-4-2 14:10:51 | 只看该作者
hanshikai 发表于 2014-4-2 14:08
谢谢指导。
这个代码我得好好消化一阵。谢谢您

简单的举个子程序的例子给你:
call 结婚(张三,李四)
call 结婚(文章,马伊俐)

subroutine 结婚(男方,女方)
  男方与女方领取结婚证
  男方与女方举办婚庆
  男方与女方去度蜜月
end subroutine 结婚

33

帖子

4

主题

0

精华

熟手

F 币
229 元
贡献
117 点
10#
 楼主| 发表于 2014-4-2 14:14:13 | 只看该作者
chuxf 发表于 2014-4-2 14:10
简单的举个子程序的例子给你:
call 结婚(张三,李四)
call 结婚(文章,马伊俐)


通俗易懂,谢谢您的指导。
到现在从零基础学了13天fortran。争取快点进步,不给老大找麻烦。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-12-24 01:38

Powered by Tencent X3.4

© 2013-2024 Tencent

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