好的,这里发生了很多事情,尤其是您使用的 Fortran 风格有点过时。让我们一步一步来...
首先确保你总是使用隐式无
其次,如果您先验地知道数组的大小,则可以使用符号常量来表示其大小。您可以通过参数执行此操作:
Program prog
Implicit None ! ALWAYS USE THIS
Integer, Parameter :: num = 36
Double Precision x( num )
Double Precision test
Double Precision v
Call Random_number( x )
v = test( x, num )
Write( *, * ) v
End Program prog
Function test( x, num )
Implicit None ! ALWAYS USE THIS
Double Precision test
Integer num
Double Precision x( num )
Integer i
test = 0.0d0
Do i = 1, num
test = test + x( i ) * x( i )
End Do
End Function test
[luser@cromer stackoverflow]$ gfortran -O -std=f95 -Wall -Wextra -pedantic func.f90
[luser@cromer stackoverflow]$ ./a.out
12.129812171430215
注意 num 是如何设置为 36 的,但是参数位意味着我不能改变它的值——它是一个常数,因此可以用来设置数组的大小。
这就是直到 1990 年的情况。然后,语言中出现了许多改变答案的东西。与您的问题最直接相关的是可分配数组,它允许您在运行时指定数组的大小,以及假定的形状数组,这使得将数组传递给子程序更简单。然而,还有很多其他的东西出现了,我建议你看一本书来了解它们——新语言比旧语言更具表现力和安全性。作为一个例子,我现在会把上面的内容写成类似
[luser@cromer stackoverflow]$ cat func.f90
Module numbers_module
Integer, Parameter :: wp = Selected_real_kind( 12, 70 )
End Module numbers_module
Module funcs_module
Use numbers_module
Implicit None
Public :: test
Private
Contains
Function test( x ) Result( sum_sq )
Implicit None ! ALWAYS USE THIS
Real( wp ) :: sum_sq
Real( wp ), Dimension( : ), Intent( In ) :: x
sum_sq = Sum( x * x )
End Function test
End Module funcs_module
Program prog
Use numbers_module
Use funcs_module
Implicit None ! ALWAYS USE THIS
Real( wp ), Dimension( : ), Allocatable :: x
Real( wp ) :: v
Integer :: num
Write( *, * ) 'How many elements ?'
Read ( *, * ) num
Allocate( x( 1:num ) )
Call Random_number( x )
v = test( x )
Write( *, * ) v
End Program prog
[luser@cromer stackoverflow]$ gfortran -O -std=f95 -Wall -Wextra -pedantic func.f90
[luser@cromer stackoverflow]$ ./a.out
How many elements ?
39
14.151818513394156
如果您决定采用这种方式,请确保您了解为什么要使用此方法,测试的接口需要在调用点的范围内 - 并且要做到这一点,请阅读一本书。
哦。常见的。拒绝吧。