派生型の変数(別名、構造体またはユーザー定義変数)を作成し、それを 1 つのサブルーチンで計算して、別のサブルーチンで使用したいと考えています。構造体の両方のコンポーネントは割り付け可能な配列です。これらの配列のサイズをサブルーチンに伝える方法を知りたいです。派生型でそれを行う方法を知っている唯一の方法は、割り当て時ですが、割り当てられるのは一度だけです。非派生型の割り当て可能配列は、サブルーチンの開始時およびインターフェイスで特定のサイズとして宣言されます。
double precision, intent(in) :: anotherINP(n,m)
しかし、派生型配列に対してはどうすればよいでしょうか?
それらが役立つ場合の詳細: 私はモジュールを持っています:
module my_type_module
type :: MyDataType
logical, allocatable :: horizjump(:,:)
integer, allocatable :: value(:,:)
end type
end module
メインコードとサブルーチンの両方がそれを使用し、新しい型を使用して変数を定義します:
use my_type_module
TYPE(MyDataType) :: HkeStruct
また、メイン コードの先頭に配置するインターフェイスもあります。
interface
subroutine CalcHKE(HkeStruct, n, m, anotherINP)
use my_type_module
integer, intent(in):: n,m
double precision, intent(in) :: anotherINP(n,m)
TYPE(myDataType), intent(out) :: HkeStruct
end subroutine CalcHKE
subroutine UseHKE(HkeStruct, n,m, Outvars)
use my_type_module
integer, intent(in) :: n,m
double precision, intent(out) :: Outvars
TYPE(myDataType), intent(in) :: HkeStruct
end subroutine UseHKE
end interface
構造体変数のコンポーネントをメインコードに配置してみた
allocate HkeStruct%horizjump(n,m), HkeStruct%value(n,m)
しかし、その変数に書き込むときに大きな値 n と m を使用してコードを実行すると、問題が発生しました (無効な書き込み、アドレスはスタック 1 にあります)。そのため、それを作成するサブルーチンに割り当ててみましたが、他のサブルーチンがそれを読み取ろうとしたときに無効な読み取りが発生しました。(ただし、これらの問題は両方とも、大規模なシステムと valgrind を使用する場合にのみ明らかです。)
完全な構造体を渡すのではなく、構造体変数のコンポーネントを通常の変数として 2 番目のサブルーチンに渡すことで、コードを実行できます。「でも、構造体変数なら使えるはずだ!!」