OK、ここでは多くのことが起こっています。特に、使用しているFortranスタイルは少し古風です。ステップごとにやってみましょう...
まず、常に暗黙的なnoneを使用するようにしてください
次に、配列のサイズが事前にわかっている場合は、シンボリック定数を使用してそのサイズを示すことができます。これは、パラメーターを介して行います。
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
この方法を採用する場合は、このメソッドを使用する理由を理解していることを確認してください。テストするインターフェイスは、呼び出しポイントのスコープ内にある必要があります。これを行うには、本を読んでください。
おー。一般。いやだっていうだけだよ。