子程序 调用
在GFortran中写的代码。刚开始想用子程序,后来发现不会,于是就没有用。运行正常,结果正确。【no_sub.f90文件】
后改为子程序,无法完成编译。如图【sub.f90文件】
压缩包含两个源代码文件及所需输入文件。 你得把 L 等数组传递到子程序中。并且定义这些数组
!计算抛物线运动的程序,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
!==================================================
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处】 我已把正确的代码贴在上面。 fcode 发表于 2014-4-2 13:49
我已把正确的代码贴在上面。
多谢管理员大人。:-)看来子程序确实是个好东东哇。
再问一下我原先那个“common 数组”没有这样的结构吗? 目前来说,common 建议不要使用了。永远不要使用。
实际上,子程序是个很好玩的东西。就你的例子来说,完全可以把 READ_VELOCITY 和 READ_ALPHA 写成同一个函数。比如 Read_Data
!计算抛物线运动的程序,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
!================================================== chuxf 发表于 2014-4-2 14:03
目前来说,common 建议不要使用了。永远不要使用。
实际上,子程序是个很好玩的东西。就你的例子来说,完 ...
谢谢指导。
这个代码我得好好消化一阵。谢谢您:-) hanshikai 发表于 2014-4-2 14:08
谢谢指导。
这个代码我得好好消化一阵。谢谢您
简单的举个子程序的例子给你:
call 结婚(张三,李四)
call 结婚(文章,马伊俐)
subroutine 结婚(男方,女方)
男方与女方领取结婚证
男方与女方举办婚庆
男方与女方去度蜜月
end subroutine 结婚 chuxf 发表于 2014-4-2 14:10
简单的举个子程序的例子给你:
call 结婚(张三,李四)
call 结婚(文章,马伊俐)
:-D
通俗易懂,谢谢您的指导。
到现在从零基础学了13天fortran。争取快点进步,不给老大找麻烦。
页:
[1]