0

我想创建一个派生类型变量(又名结构或用户定义的变量),在一个子程序中计算它并在另一个子程序中使用它。该结构的两个组件都是可分配的数组。我想知道如何告诉子程序这些数组的大小。我知道如何使用派生类型执行此操作的唯一方法是在分配时,但我只能分配一次。非派生类型的可分配数组在子例程的开头和接口中被声明为特定大小:

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 时才明显。)

我可以通过将结构变量的组件作为常规变量传递给第二个子例程来运行代码,而不是传递完整的结构。“但它应该能够与结构变量一起使用!!”

4

1 回答 1

2

要获取大小:

n = size(HkeStruct%horizjump, dim=1)
m = size(HkeStruct%horizjump, dim=2)

这适用于以假定形状或派生类型传递的可分配数组。

您遇到的错误可能与编译器的分配模式有关。例如,看看http://jblev​​ins.org/log/segfaulthttp://people.sc.fsu.edu/~jburkardt/f_src/memory_test/memory_test.html

于 2016-11-01T22:01:09.277 回答