在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
答案 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
但这可能不是你想要的,因为你正在处理指针数组。