Fortran Coder

标题: Fortran函数的声明无需写明参数? [打印本页]

作者: Glen    时间: 2022-10-18 10:20
标题: Fortran函数的声明无需写明参数?
本帖最后由 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行:声明函数不需要带上参数?




作者: kyra    时间: 2022-10-18 10:47
本帖最后由 kyra 于 2022-10-18 10:48 编辑

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

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

作者: Glen    时间: 2022-10-19 21:47
本帖最后由 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里面之后,编译器就知道那些名称是指函数/子程序了。





欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2