0

よろしくお願いします。メインのFORTRANプログラムの出力ファイルにデータを印刷し、これらのデータをモジュールで定義したいと思います。すでにメインプログラムでそのモジュールを使用することを宣言しています。しかし、メインプログラムでもモジュールでもwriteステートメントを取得できませんでした。

MODULE model 
IMPLICIT NONE
 SUBROUTINE model_initialize 
 IMPLICIT NONE
 INTEGER a,dim REAL(float) :: E,nu 
 REAL(float) :: lambda,mu 
 E=5000 lambda = E*nu/(1.d0+nu)/(1.d0-2.d0*nu) 
 mu = E/2.d0/(1.d0+nu) 
 RETURN 
 END SUBROUTINE model_initialize 
 Write (6,)'Lambda',lambda 
 Write (6,)'mu',mu 
 END MODULE model 
 SUBROUTINE XXXX 
 USE model 
 IMPLICIT NONE 
 CALL model_initialize 
 Write (6,)'Lambda',lambda 
 Write (6,)'mu',mu 
 END SUBROUTINE XXX

モジュールまたはメインサブルーチンにwriteステートメントを配置すると、出力にそれらが表示されません。

Msekhの助けに感謝します

4

2 に答える 2

1

Mgilsonはすでに動作するはずの例を提供していますが、投稿したコードはコンパイルされません。これが理由です:

  • サブルーチンmodel_initializeは、モジュールの「仕様部分」にあります。モジュールの外部(のようなxxxx)または内部(この場合、containsステートメントを提供する必要があります)のいずれかである必要があります。
  • の変数model_initializeはサブルーチンに対してローカルであり、サブルーチンの外部からはアクセスできません。
  • writeモジュールの仕様部分に実行可能コード(のような)を含めることはできません。内部プロシージャにのみ含めることができます。
  • floatはネイティブのFortranの種類ではないため、数値パラメーター(通常は4、8、16)を使用するか、独自のパラメーターを定義するか、iso_fortran_envモジュール内の定義を使用する必要があります。

とはいえ、アクセス可能にしたいデータを定義するだけでよい場合は、次のようにモジュールに直接配置できます。

module model
  use iso_fortran_env 
  implicit none

  integer :: A, dim 
  real(real32) :: E, nu, lambda, mu

  E = 5000
  lambda = E*nu/(1.d0+nu)/(1.d0-2.d0*nu)   ! <-- nu is undefined
  mu = E/2.d0/(1.d0+nu)

contains

  subroutine xxxx 
    write (6,*) 'lambda', lambda 
    write (6,*) 'mu', mu 
  end subroutine xxxx
end module model
于 2013-01-29T12:40:23.080 に答える
1

次のような意味ですか?

module material
  real :: stress = 6.0
  save
end module material

subroutine xxx()
  use material, only: stress
  write(6,*) stress
end subroutine

program main
call xxx()
end program main

fort.6これにより、ユニット6に接続されているファイルのようなオブジェクトにストレスの値が書き込まれます(通常、これはstdoutですが、コンパイラと環境の設定によっては、呼び出される新しいファイルが作成される場合があります)。

于 2013-01-17T02:30:54.100 に答える