4

Fortran プログラムでファイルから大量のデータを読み取る必要があります。データのサイズは可変なので、配列を動的に割り当てたいと思います。私の考えは、すべてのデータを読み取り、メモリを割り当てるサブルーチンを作成することです。プログラムの簡略版は次のとおりです。

  program main

  implicit none
  real*8, dimension(:,:), allocatable :: v
  integer*4 n

  !This subroutine will read all the data and allocate the memory 
  call Memory(v,n)

  !From here the program will have other subroutines to make calculations

  end


  subroutine Memory(v,n)

  implicit none
  real*8, dimension(:,:), allocatable :: v
  integer*4 n,i

  n=5
  allocate(v(n,2))
  do i=1,n
  v(i,1)=1.0
  v(i,2)=2.0 
  enddo

  return
  end subroutine Memory

このプログラムでは、次のエラーが表示されます。

Error: Dummy argument 'v' of procedure 'memory' at (1) has an attribute that requieres an explicit interface for this procedure

これは、この種のプログラムを構造化する正しい方法ですか? もしそうなら、どうすればエラーを解決できますか?

ありがとう。

4

1 に答える 1

9

あなたの投稿が示唆するように、プログラムとサブルーチンの両方を含む単一のソースファイルがあると仮定すると、最も簡単な修正はステートメントを含む行を置き換えることです

end

ステートメントを含む行で

contains

ソースファイルの最後に、次のステートメントを含む行を書き込みます。

end program

(はい、キーワードprogramは必須ではありませんが、便利です。)

コンパイラが報告した問題は、コードが構造化されているため、プログラムはサブルーチンへのインターフェイスについて何も認識していないことmemoryです。そのインターフェイスは、Fortran 用語では暗黙的です。サブルーチンを呼び出して、割り当て可能な配列を渡すか渡す場合、そのサブルーチンには明示的なインターフェイスが必要です。

明示的なインターフェイスを提供するには、いくつかの方法があります。1 つは、お見せしたように、プログラム内にサブルーチンを含めることです。プログラムが少し大きくなった場合のもう 1 つのより便利な方法は、サブルーチンをモジュールに記述し、それらを使用するプログラムでそれらを使用関連付けすることです。modules とuseステートメントをカバーする Fortran チュートリアルの部分を読んでください。

他に少なくとも 1 つのオプションがありますが、特に初心者にとっては魅力的ではないため、ここでは触れません。

そして、私が書いている間にintent、サブルーチンへの引数が読み取られるか、書き込まれるか、またはその両方であるかを指定するキーワードについて学び、使用してください。これは、安全なプログラミングに大いに役立ちます。お気に入りの Fortran リソースが詳細に説明しています。

于 2013-08-02T10:54:30.113 に答える