我想创建一个derived-type variable(a.k.a . 结构或用户定义的变量),在一个子程序中计算它并在另一个子程序中使用它 . 结构的两个组件都是可分配的数组 . 我想知道如何告诉子程序这些数组的大小 . 我知道如何使用派生类型执行此操作的唯一方法是分配时,但我只能分配一次 . 非派生类型可分配数组在子例程的开头和接口中声明为特定大小:
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时才会明显 . )
我可以通过将结构变量的组件作为常规变量传递给第二个子例程来运行代码,而不是传递完整的结构 . “但它应该能够使用结构变量!!”
1 回答
要获得大小:
这适用于以假定形状或派生类型传递的可分配数组 .
您遇到的错误可能与编译器的分配模式有关 . 例如,看看http://jblevins.org/log/segfault或http://people.sc.fsu.edu/~jburkardt/f_src/memory_test/memory_test.html .