无法将初始值分配给模块中的派生数据类型

时间:2013-03-05 14:24:44

标签: pointers module initialization fortran derived-types

在Fortran module中,我试图将初始值分配给派生数据类型,该派生数据类型的组件是过程指针,但会收到错误消息:意外指针赋值。

module中,如何将初始值赋给包含过程指针的派生类型?

    module pointer_mod  

    use legendrePolynomials
    implicit none

    interface
      function func (z)
      real*8 :: func
      real*8, intent (in) :: z
      end function func
    end interface

    type proc_ptr
      procedure (func), pointer, nopass :: f_ptr
    end type proc_ptr

    type(proc_ptr), dimension(6) :: basis

    basis(1) % f_ptr => Legendre0 ! or basis(1) % f_ptr => null()

    end module pointer_mod   

其中:

    function Legendre0(x) result(y)
    real, intent(in) :: x
    real :: y
    y = 1
    end function

2 个答案:

答案 0 :(得分:3)

您收到错误消息,因为您在任何子例程之外发出指针赋值,通常只发生声明。将赋值放在子例程中(见下文)显示,事情完美无缺,只要你确定,Legendre0()函数也使用real * 8类型来匹配接口声明(为了测试目的,我也把同一模块中的勒让德功能):

module pointer_mod  
  implicit none

  interface
    function func (z)
      real*8 :: func
      real*8, intent (in) :: z
    end function func
  end interface

  type proc_ptr
    procedure (func), pointer, nopass :: f_ptr
  end type proc_ptr

  type(proc_ptr), dimension(6) :: basis


contains

  subroutine test()
    basis(1)%f_ptr => Legendre0 ! or basis(1) % f_ptr => null()
  end subroutine test

  function Legendre0(x) result(y)
    real*8, intent(in) :: x
    real*8 :: y
    y = 1
  end function Legendre0

end module pointer_mod

作为补充评论:您应该考虑声明您的真实变量,如

integer, parameter :: dp = kind(1.0d0)
real(dp) :: whatever

而不是real*8符号,这是绝对的。

答案 1 :(得分:1)

另一种解决方案是使Legendre0的函数指针成为所有类型(proc_ptr)变量的默认值。

type proc_ptr
  procedure (func), pointer, nopass :: f_ptr => Legendre0
end type proc_ptr

但这可能不是你想要的,因为你正在处理指针数组。