web-dev-qa-db-ja.com

関数には暗黙の型はありません

関数の操作方法を学ぼうとしています。私は次のコードを持っています:

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
10
sodiumnitrate

行を移動します

end program

ソースファイルの最後に、その場所に次の行を書き込みます

contains

あなたがあなたのプログラムを書いたので、それはコンパイラがあなたに言っていることである関数testの知識を持っていません。プログラムに必要な知識を提供する方法の1つを提案しましたが、他にもあります。あなたは学習者なので、何が起こっているのかを詳しく理解するためにあなたに任せます。

12

念のため、誰かが同じ問題を抱えている場合、別の方法(特にコメントで説明されている場合)は追加することです

integer,external :: test

implicit none

メインプログラムで。

10
PeMa

これを置くだけ:

program main
  implicit none

整数テスト

  write(*,*) test(4)
end program
...

コンパイラが関数の戻り値の型を知るためには、関数を変数として宣言する必要があります。

3
renedet

現在の回答では言及されていない別の簡単な方法:

関数をメインプログラムの前に移動し、module subsimplicit 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
2
Vladimir F