1

私は Fortran プログラミングの初心者です。2 つの .f90 ファイルがあります。

fmat.f90

function fmat(t,y)
 implicit none
 real::t
 real::y(2)
 real::fmat(2)
 fmat(1) = -2*t+y(1)
 fmat(2) = y(1)-y(2)
end function fmat

そして、main.f90 は次のようになります。

program main
 implicit none
 real::t
 real::y(2)
 real::fmat(2)
 real::k(2)
 t=0.1
 y(1)=0.5
 y(2)=1.4
 k=fmat(t,y)
 write(*,*) k
end program main

だから、私は0.3 -0.9を期待しています。しかし、次のエラーメッセージが表示され続けます。

ifort fmat.f90 main.f90

main.f90(13): error #6351: The number of subscripts is incorrect.   [FMAT]
k=fmat(t,y)
--^
compilation aborted for main.f90 (code 1)

どんな助けでも大歓迎です!

!==== 編集 ====

マークの回答に感謝します。「サブルーチン」アプローチを使用して、実際にエラーなしで個別のファイルをコンパイルできました。

main.f90

program main
  implicit none
  real::t
  real::y(2)
  real::k(2)
  t=0.1
  y(1)=0.5
  y(2)=1.4
  call fmat_sub(t,y,k)
  write(*,*) k
end program main

fmat_sub.f90

subroutine fmat_sub(t,y,k)
  implicit none
  real::t
  real::y(2),k(2)
  k(1) = -2*t+y(1)
  k(2) = y(1)-y(2)
end subroutine fmat_sub
4

1 に答える 1

5

の宣言は、mainランク1と長さ2の実数の配列であるreal::fmat(2)ことをコンパイラーに通知します。他のファイルに書き込まれた関数については何も通知しません。fmatfmat

このような問題を回避する良い方法の1つは、最新のFortranの機能を使用することです。サブルーチンと関数をモジュールに入れて、それらを使用-関連付けます。だから、fmat.f90次のようなものに変更します

module useful_functions

contains
function fmat(t,y)
 implicit none
 real::t
 real::y(2)
 real::fmat(2)
 fmat(1) = -2*t+y(1)
 fmat(2) = y(1)-y(2)
end function fmat

end module useful_functions

main.f90次のようなものに変更します

program main
 use useful_functions
 implicit none
 real::t
 real::y(2)
 real::k(2)
 t=0.1
 y(1)=0.5
 y(2)=1.4
 k=fmat(t,y)
 write(*,*) k
end program main

このアプローチにより、コンパイラはモジュール関数の明示的なインターフェイスを生成し、コンパイル時にダミー引数実際の引数の一致をチェックできます。

あなたは初心者なので、いくつかの重要な用語をイタリック体で示しています。それらについては、コンパイラのマニュアルまたはその他のお気に入りのFortranドキュメントで読んでください。

問題を解決する別の方法は、次のようmain.f90に関数のソースを含めるように編集することです。fmat

program main
 implicit none
 real::t
 real::y(2)
 real::k(2)
 t=0.1
 y(1)=0.5
 y(2)=1.4
 k=fmat(t,y)
 write(*,*) k

contains

function fmat(t,y)
 implicit none
 real::t
 real::y(2)
 real::fmat(2)
 fmat(1) = -2*t+y(1)
 fmat(2) = y(1)-y(2)
end function fmat
end program main

私は最初のアプローチを好みます。プログラムやプロジェクトが大きくなり、モジュール化のメリットが便利ではなく必需品になり始めたときに、はるかに拡張性が高くなりますが、言語を学習している小さなプログラムでは、2番目のアプローチで問題ありません。

于 2012-08-29T09:44:58.830 に答える