【发布时间】:2016-09-03 08:02:42
【问题描述】:
我正在使用以数组类型声明的 Fortran 函数。问题是编译器不保留数组的边界,例如,我声明了
function normalize(vector)
real,dimension(0:)::vector
real,dimension(0:size(vector)-1)::normalize
real scale
integer dim
scale=norm_real(vector)
if (scale/=0) then
do dim=0,size(vector)-1
normalize(dim)=vector/scale
end do
end if
write(*,*) Lbound(normalize,1)
end function normalize
...
real, dimension(:), allocatable :: B
B = normalize(vector)
write(*,*) Lbound(B,1)
在这种情况下,我验证函数 normalize 的 Lbound 为 0,但它的 Lbound 在主程序或另一侧为 1。 那么如何保存它的 Lbound 呢?
【问题讨论】:
-
您应该展示更多代码并展示您如何诊断问题。你如何打印 lbound?
-
这是极少数情况下指针是您的朋友的情况之一。当您将数组作为参数传递给子例程时,实际参数的上限和下限不会在调用中保持,除非下限为 1。但是,在传递指针时,下限和上限会保持不变。请阅读stackoverflow.com/questions/38140951/…
-
@jlokimlin 如果他使用子例程参数,那么 allocatable 就足够了。但是,问题是关于函数结果,而不是关于子例程参数。我同意它没有写得很清楚。对 M.S.B. 的回答的评论在一定程度上解释了这一点。