0

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

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

    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
4

2 回答 2

3

您收到错误消息,因为您在任何子例程之外发出指针分配,通常只应发生声明。将赋值放入子程序(见下文)表明,如果您确保该Legendre0()函数也使用 real*8 类型以匹配接口声明(出于测试目的,我还将 Legendre 函数放在相同的模块):

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过时的符号。

于 2013-03-05T15:14:25.207 回答
1

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

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

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

于 2013-03-05T15:33:07.887 回答