Fortran Coder

查看: 2540|回复: 2
打印 上一主题 下一主题

[子程序] Fortran函数的声明无需写明参数?

[复制链接]

9

帖子

3

主题

0

精华

入门

F 币
49 元
贡献
21 点
跳转到指定楼层
楼主
发表于 2022-10-18 10:20:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Glen 于 2022-10-18 10:22 编辑

[Fortran] 纯文本查看 复制代码
PROGRAM test_ave_value
!
! Purpose:
! To test function ave_value by calling it with a user-defined
! function my_func.
!
! Record of revisions:
! Date Programmer Description of change
! ==== ========== =====================
! 11/24/15 S. J. Chapman Original code
!
IMPLICIT NONE
! Data dictionary: declare function types
REAL :: ave_value ! Average value of function
REAL, external:: my_function ! Function to evaluate 
! Data dictionary: declare local variable types & definitions
REAL :: ave ! Average of my_function
! Call function with func=my_function.
ave = ave_value ( my_function, 0., 1., 101 )
WRITE (*,1000) 'my_function', ave
1000 FORMAT ('The average value of ',A,' between 0. and 1. is ', F16.6,'.')
END PROGRAM test_ave_value


REAL FUNCTION ave_value ( func, first_value, last_value, n )
!
! Purpose:
! To calculate the average value of function "func" over the
! range [first_value, last_value] by taking n evenly-spaced
! samples over the range, and averaging the results. Function
! "func" is passed to this routine via a dummy argument.
!
! Record of revisions:
! Date Programmer Description of change
! ==== ========== =====================
! 11/24/15 S. J. Chapman Original code
!
IMPLICIT NONE
! Data dictionary: declare calling parameter types & definitions
REAL, external :: func ! Function to be evaluated
REAL, INTENT(IN) :: first_value ! First value in range
REAL, INTENT(IN) :: last_value ! Last value in rnage
INTEGER, INTENT(IN) :: n ! Number of samples to average
! Data dictionary: declare local variable types & definitions
REAL :: delta ! Step size between samples
INTEGER :: i ! Index variable
REAL :: sum ! Sum of values to average
! Get step size.
delta = ( last_value - first_value ) / REAL(n-1)
! Accumulate sum.
sum = 0.
DO i = 1, n
sum = sum + func ( REAL(i-1) * delta )
END DO
! Get average.
ave_value = sum / REAL(n)
END FUNCTION ave_value


REAL FUNCTION my_function( x )
IMPLICIT NONE
REAL, INTENT(IN) :: x
my_function = cos(x)
END FUNCTION my_function

我有一些疑问:
第14行:声明函数不需要带上参数?此处也不需要external关键字?
第15行:声明函数不需要带上参数?



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

259

帖子

0

主题

0

精华

版主

World Analyser

F 币
717 元
贡献
510 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
沙发
发表于 2022-10-18 10:47:02 | 只看该作者
本帖最后由 kyra 于 2022-10-18 10:48 编辑

这种方式虽然可以,但是不好。容易出错。
现代Fortran程序,提倡把所有函数和子程序,全部包含在module里。

这样,就无需声明函数了。而且编译器也可以进行参数检查。
此外。某些情况下,例如回调函数,仍然需要声明函数。此时可用 interface 代替 external,以便编译器进行参数检查。

9

帖子

3

主题

0

精华

入门

F 币
49 元
贡献
21 点
板凳
 楼主| 发表于 2022-10-19 21:47:19 | 只看该作者
本帖最后由 Glen 于 2022-10-20 08:40 编辑
kyra 发表于 2022-10-18 10:47
这种方式虽然可以,但是不好。容易出错。
现代Fortran程序,提倡把所有函数和子程序,全部包含在module里。 ...

把 ave_value和my_function函数放到module里面后,主程序确实不需要声明这2个函数了,而且在ave_value函数内部声明func形式函数的时候也不需要加external了。我以后慢慢研究external和interface何时该用吧。
-----我想明白了,如果函数和子程序被用作其他过程的参数,那么必须声明为external,否则编译器分不清那些名字是函数/子程序还是常规的变量,但是放到module里面之后,编译器就知道那些名称是指函数/子程序了。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-11-23 12:00

Powered by Tencent X3.4

© 2013-2024 Tencent

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