関数の操作方法を学ぼうとしています。私は次のコードを持っています:
program main
implicit none
write(*,*) test(4)
end program
integer function test(n)
implicit none
integer, intent(in) :: n
integer :: i, ans
ans=1
do i=1,n
ans=ans*i
enddo
test=ans
end function test
(gfortran 4.1.2を使用して)コンパイルすると、次のエラーが発生します。
In file test.f90:4
write(*,*) test(4)
1
Error: Function 'test' at (1) has no IMPLICIT type
行を移動します
end program
ソースファイルの最後に、その場所に次の行を書き込みます
contains
あなたがあなたのプログラムを書いたので、それはコンパイラがあなたに言っていることである関数test
の知識を持っていません。プログラムに必要な知識を提供する方法の1つを提案しましたが、他にもあります。あなたは学習者なので、何が起こっているのかを詳しく理解するためにあなたに任せます。
念のため、誰かが同じ問題を抱えている場合、別の方法(特にコメントで説明されている場合)は追加することです
integer,external :: test
後
implicit none
メインプログラムで。
これを置くだけ:
program main
implicit none
整数テスト
write(*,*) test(4)
end program
...
コンパイラが関数の戻り値の型を知るためには、関数を変数として宣言する必要があります。
現在の回答では言及されていない別の簡単な方法:
関数をメインプログラムの前に移動し、module subs
、implicit none
、およびcontains
を関数の前に置き、end module
を関数の後に置きます。 use subs
をプログラムに入れます。
このようにして、プログラムはsubs
モジュール内のプロシージャについて必要なすべて(「明示的なインターフェイス」)を確認し、それらを正しく呼び出す方法を知ることができます。プロシージャを誤って呼び出そうとすると、コンパイラは警告とエラーメッセージを提供できます。
module subs
implicit none
contains
integer function test(n)
!implicit none no longer necessary here
end function test
end module
program main
use subs
implicit none