我想在Fortran 2003中为指针数组赋值。指针数组是通过派生数据类型arrpntr
实现的。请看下面的一个简单示例:
PROGRAM TST_PNTR
real, allocatable, target :: arr1(:), arr2(:)
! array of pointers
type :: arrpntr
real, pointer :: arr(:) => null()
end type
type(arrpntr) :: p(2)
integer :: err
integer, parameter :: M = 10, N = 10
allocate(arr1(M), arr2(N), stat=err)
arr1 = [ (i, i=1, 10) ]
arr2 = arr1**2
! arr1 = arr1-0.5
! p(1)%arr => arr1
p(1)%arr => arr1-0.5
p(2)%arr => arr2
write(*,*) p(1)%arr
write(*,*) p(2)%arr
arr1 = arr1**2
arr2 = sqrt(arr2)
write(*,*) p(1)%arr
write(*,*) p(2)%arr
deallocate(arr1, arr2, stat=err)
nullify(p(1)%arr, p(2)%arr)
END PROGRAM TST_PNTR
在当前状态下,编译器会抛出错误:Pointer assignment target is neither TARGET nor POINTER at (1)
抱怨行p(1)%arr => arr1-0.5
。它适用于我将操作分成两部分的情况,如上面的注释行。但是,我希望在不将临时变量arr1
中存储中间结果的情况下获得相同的结果。操作arr1-0.5
就是一个简单的例子。实际上,我想在p(1)%arr =>
的右侧使用更复杂的表达式。有没有更好的方法来避免使用中间数组?