主题:[讨论]矢量下标作数组索引时的只读属性
最近在 debug 程序时得到了确认,花去了我几天的时间,实在有些不甘心。为避免诸位误入此类陷阱,特发帖说明。其实无论是 Intel 的 reference 还是 IBM 的线上文档都有说明,但在遇到这个问题之前谁又会注意到呢?:P
program main
implicit none
integer, dimension(4) :: array
array = 0
call eval(array(2:), 3)
print *, array(3)
array = 0
call eval(array((/2,3,4/)), 3)
print *, array(3)
stop
end program
subroutine eval(a, n)
implicit none
integer, intent(in) :: n
integer, dimension(n) :: a
a(2) = -1
return
end subroutine eval
以上为测试代码,如果遇到过这个问题的朋友,一看便知。
[quote][I]If you pass an array section with a vector subscript as an actual argument, the associated dummy argument must not be defined or redefined.[/I][/quote]
这是 IBM 线上文档对于矢量下标哑实传递的说明。用的是 must not be defined or redefined,所以我想这应该是个只读属性。正如上例中所示,即使 redefined,实参并无影响。
但如果不作子程序传递,直接赋值,比如:
array((/2,3,4/)) = -1
这是可行的。也即,只是哑实传递时才会有这个限制。对于 Intel 汇编不熟悉,不太清楚编译器是如何实现的。是直接抛弃还是在传递时作了复制操作?
另外,基于 gcc 4.5.3 的 gfortran 尚不支持 array((/1,3:4/)) 这种混合下标索引。
program main
implicit none
integer, dimension(4) :: array
array = 0
call eval(array(2:), 3)
print *, array(3)
array = 0
call eval(array((/2,3,4/)), 3)
print *, array(3)
stop
end program
subroutine eval(a, n)
implicit none
integer, intent(in) :: n
integer, dimension(n) :: a
a(2) = -1
return
end subroutine eval
以上为测试代码,如果遇到过这个问题的朋友,一看便知。
[quote][I]If you pass an array section with a vector subscript as an actual argument, the associated dummy argument must not be defined or redefined.[/I][/quote]
这是 IBM 线上文档对于矢量下标哑实传递的说明。用的是 must not be defined or redefined,所以我想这应该是个只读属性。正如上例中所示,即使 redefined,实参并无影响。
但如果不作子程序传递,直接赋值,比如:
array((/2,3,4/)) = -1
这是可行的。也即,只是哑实传递时才会有这个限制。对于 Intel 汇编不熟悉,不太清楚编译器是如何实现的。是直接抛弃还是在传递时作了复制操作?
另外,基于 gcc 4.5.3 的 gfortran 尚不支持 array((/1,3:4/)) 这种混合下标索引。