Types 可分配的用户派生类型

Types 可分配的用户派生类型,types,fortran,allocation,Types,Fortran,Allocation,我有一个关于Fortran和正确分配的问题 可分配的用户派生类型 这是我的密码: module polynom_mod implicit none type monomial integer,dimension(2) :: exponent end type type polynom real, allocatable, dimension(:) :: coeff type(monomial),allocatable, dimension(:) :: monom l

我有一个关于Fortran和正确分配的问题 可分配的用户派生类型

这是我的密码:

module polynom_mod
 implicit none

 type monomial
  integer,dimension(2) :: exponent
 end type

type polynom
  real, allocatable, dimension(:) :: coeff
  type(monomial),allocatable, dimension(:)   :: monom
  logical :: allocated
 !recursive type
  type(polynom),pointer :: p_dx,p_dy
 contains
  procedure :: init
  procedure :: init_dx
end type
在这里,我想导出一个类型多项式,我可以在其中执行以下操作:

p%coeff(1)=1.0 
p%monom(1)%exponent(1)=2
比如:

p%p_dx%coeff(1)=1.0 
p%p_dx%monom(1)%exponent(1)=2
type(polynom) :: p

p%init(2)
p%dx%init_dx(3)
因此,我编写了一些init类型绑定过程,可以在其中初始化和分配 类型:

结束程序

这将使用gfortran 4.6.3编译,但当我运行它时,我遇到了一个分段错误


有办法分配递归可分配类型吗?

代码的表面问题是,当计算表达式
p%p\u dx%init\u dx(2)
时,指针组件
p%p\u dx
未定义,并引发分段错误。请注意,指针是未定义的,不仅仅是未关联

现在我正努力想出一个快速解决方案。长期的解决办法是解决我认为你的方法中的一个严重缺陷;请注意,这是我的意见,而不是一个黑或白的问题,所以只有当你关心我的意见时,请继续阅读

函数
init
init_dx
并非没有副作用,实际上它们几乎可以说是所有副作用——它们返回一个逻辑值,并且作为副作用,初始化一个
polynom
变量。程序似乎无法在不计算
init
的情况下初始化
polynom
,也无法在不将其包装到以下语句的情况下计算
init

if (p%init(2)) then
end if
我想,您可以将这些初始化函数重写为子例程,也许可以使用以下签名

call initialise_polynom(p,2)
这至少可以消除代码中不纯函数的污点。但更好的方法是编写一个函数,如:

function new_poly(num)
  implicit none
  integer, intent(in) :: num
  type(polynom) :: new_poly
  allocate(new_poly%coeff(num))
  allocate(new_poly%monom(num))
  allocate(new_poly%p_dx)
end function new_poly
哪个

a) 返回一个新的
多项式
;及

b) 分配组件
p_dx
;及

c) 没有副作用

然后可以使用以下表达式创建新的
多项式

p = new_poly(3)
p%p_dx = new_poly(3)
并使用表达式初始化组件,如

p = new_poly(3)
p%p_dx = new_poly(3)

在回答我自己的问题时,我提出了另一个解决方案,witch也可以在没有指针的情况下工作,但它不像Marks one那样优雅

定义其他类型:

type p_dx
 real, allocatable, dimension(:) :: coeff
 type(monomial),allocatable, dimension(:)   :: monom
 logical :: allocated
end type
然后将其用于:

type polynom
 real, allocatable, dimension(:) :: coeff
 type(monomial),allocatable, dimension(:)   :: monom
 type(p_dx) :: dx
 logical :: allocated
contains
 procedure     :: init
end type
因此,您可以执行以下操作:

p%p_dx%coeff(1)=1.0 
p%p_dx%monom(1)%exponent(1)=2
type(polynom) :: p

p%init(2)
p%dx%init_dx(3)

非常感谢。您对导致分段错误的未初始化指针的看法是正确的。我要避免使用变量,例如您的
logical::assigned
,当您将它与内在的
assigned
函数混淆时,它只会导致悲伤和绝望。