最初に同じコードブロックを使用するプログラムがいくつかありますが、異なる処理を実行します。このコードブロックを外部ファイル(Fortranファイルまたはテキストファイル)で宣言することは可能ですか?したがって、このコードの一部(私が話しているブロック内)を変更したい場合は、で変更する必要はありませんすべてのプログラム?
例:外部ファイルで生成されたベクトルXを使用して異なる操作を実行する2つのプログラムMAIN1およびMAIN2。
PROGRAM MAIN1
IMPLICIT NONE
! External block here
REAL, PARAMETER :: M = REAL(N)*2.0
INTEGER :: i
REAL :: Out1
Out1 = 0.0
DO i = 1,SIZE(X,1)
Out1 = Out1+M*X(i)
END DO
PRINT *, Out1
END PROGRAM MAIN1
PROGRAM MAIN2
IMPLICIT NONE
! External block here
REAL, PARAMETER :: M = 1.0
INTEGER :: i
REAL :: Out2
Out1 = 1.0
DO i = 1,SIZE(X,1)
Out2 = Out2*M*X(i)
END DO
PRINT *, Out2
END PROGRAM MAIN2
そしてこれは外部コードです:
INTEGER,PARAMETER :: N = 5
REAL :: X(N)
CALL RANDOM_NUMBER(X)
モジュールに外部コードを入れようとしましたがINTEGER,PARAMETER :: N = 5
、IMPLICIT NONE
ステートメントの直後に外部ブロックを呼び出したい場合は、この方法でサブルーチンを呼び出すことはできません(すべての行がタイプである必要があることを理解しているため)。
何か案は?
あなたがやりたいと思われることは、何らかの形のリストラなしでは不可能です。この理由は、その行が
call random_number(x)
実行可能ステートメントです。このような行は、すべての宣言に従わなければなりません。include
したがって、(ステートメントなどによる)単一のリテラルテキスト置換は許可されていません。
とはいえ、モジュールは実行可能なアプローチです。宣言と実行可能ステートメントを分離するだけで済みます。
module shared
implicit none
integer, parameter :: N=5
real x(N)
contains
subroutine setup
call random_number(x)
end subroutine
end module
program main1
use shared ! Note _before_ implicit
implicit none
real, parameter :: M=REAL(N)*2
integer i
real Out1
call setup ! Executable, after declarations.
Out1 = 0.0
do i = 1,SIZE(x,1)
Out1 = Out1+M*X(i)
end do
print *, Out1
end program main1
[別の方法は、2つの異なるリテラルテキストを挿入することです。さらに悪いことに、1回の挿入に減らすと、block
構成の使用になります。その厄介さを示すつもりはありません。]
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加