2013-05-07 46 views
1

我有一个关于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 

所以我写了一些初始化类型绑定的程序,我可以初始化我的并分配我的 类型:

contains 

function init(this,num) result(stat) 
    implicit none 
    integer, intent(in)  :: num 
    class(polynom),intent(inout) :: this 
    logical :: stat 

    allocate(this%coeff(num)) 
    allocate(this%monom(num)) 

    this%allocated = .TRUE. 
    stat = .TRUE. 
end function 

function init_dx(this,num) result(stat) 
    implicit none 

    integer, intent(in)  :: num 
    class(polynom),intent(inout) :: this 

    logical :: stat 

    allocate(this%p_dx%coeff(num)) 
    allocate(this%p_dx%monom(num)) 

    this%p_dx%allocated = .TRUE. 
    stat = .TRUE. 
end function 
end module 

program testpolytype 
use polynom_mod 

type(polynom) :: p 

if(p%init(2)) then 
    print *,"Polynom allocated!" 
end if 

if(p%p_dx%init_dx(2)) then 
    print *,"Polynom_dx allocated!" 
end if 

端程序

这将gfortran 4.6.3编译但是当我跑了我有一个分割的错!

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

回答

2

您的代码的表面问题是,当计算表达式p%p_dx%init_dx(2)时,指针组件p%p_dx未定义,并且引发了段错误。请注意,指针是undefined而不仅仅是没有关联

现在我正在努力想出一个快速修复。长期的解决办法是解决我认为你的方法存在严重缺陷;请注意,这是我的意见,而不是黑白问题,只有在您关心我的意见的情况下才能阅读。

功能initinit_dx不是免费的副作用,他们确实可以说是几乎所有的副作用 - 他们返回一个逻辑值,并作为一个副作用,初始化一个polynom变量。该方案似乎没有办法初始化一个polynom没有评估init也没有办法不包成一条语句,如

if (p%init(2)) then 
end if 

你可以,我想,重写这些初始化功能子程序来评估init,也许一个签名,如

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 

一)返回一个新polynom;和

b)分配组件p_dx;和

c)无副作用。

然后,您可以创建一个新的polynom与作为

p = new_poly(3) 

这样的表达,并用一个表达式初始化组件如

p%p_dx = new_poly(3) 
+0

谢谢!对于导致分段错误的未初始化指针,你是正确的。 – 2013-05-08 10:47:29

0

回答我的问题,我想出了一个其他解决方案女巫也没有指针,但它不像马克斯那么优雅。

定义的其他类型:

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 

,所以你可以这样做:

type(polynom) :: p 

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

我会避免一个像'logical :: allocated'这样的变量,当你将它与内部'alloc'函数混淆时,这只会导致悲伤和绝望。 – 2013-05-08 11:04:19