Arrays 保留函数数组结果的边界

Arrays 保留函数数组结果的边界,arrays,function,fortran,Arrays,Function,Fortran,我正在使用一个用数组类型声明的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

我正在使用一个用数组类型声明的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。
那么我怎样才能保存它的lbund呢?

我不认为你可以,但另一方面,这并不重要。Fortran认为数组形状是更基本的属性。即使函数return的lbound变为1,也可以将其分配给lbound为0的数组或任何其他值。您有重要的案例吗?

您应该显示更多代码,并显示如何诊断问题。如何打印lbound?这是指针成为你朋友的极少数情况之一。将数组作为参数传递给子例程时,除非下界为1,否则调用中不会保留实际参数的上限和下限。但是,当传递指针时,保持上下限。请阅读@jlokimlin,如果他使用子例程参数,那么可分配就足够了。然而,问题在于函数结果,而不是子程序参数。我同意它写得不太清楚。对M.S.B.答案的注释在某种程度上解释了这一点。是的,如果我将函数的值保存在一个0 Lbound的数组中,就没有问题了。然而,在长的fortran代码中,我们需要一些时间来传递数组类型的函数作为其他函数的参数,(以避免使用额外的变量),或者自动分配带有其值的可分配函数,因为它在fortran 2003中是允许的。(例如B=normalize(vector))。这里B是一个动态数组。这个答案是正确的,你不能。如果要分配到特定的下限,可以使用子例程。不能使用函数。我仍然不完全清楚您最终想要实现什么。@VladimirF的问题是,如何保持返回数组类型的函数的形状,因为当我在主程序中调用它时,它会发生绑定更改。@Nouri.M答案是这是不可能的。@VladimirF感谢您的重播,我希望它能在下一个fortran版本中实现。