【问题标题】:Preserve the bounds of a function array result保留函数数组结果的边界
【发布时间】: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. 的回答的评论在一定程度上解释了这一点。

标签: arrays function fortran


【解决方案1】:

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

【讨论】:

  • 是的,没有问题,如果我将函数的值保存在一个 Lbound 为 0 的数组中。然而,在较长的 fortran 代码中,我们需要一些时间来将具有数组类型的函数作为参数传递给其他函数,(以避免使用额外的变量)或自动分配具有其值的可分配对象,因为它在 fortran 2003 中是允许的。(对于例如 B=normalize(vector))。其中 B 在这种情况下是一个动态数组。
  • 这个答案是正确的,你不能。如果要分配给特定的下限,可以使用子例程。您不能使用函数。我仍然不完全清楚您最终想要实现什么。
  • @VladimirF 问题是如何保留返回数组类型的函数的形状,因为当我在主程序中调用它时它会发生 Lbound 变化。
  • @Nouri.M 答案是不可能的。
  • @VladimirF 感谢重播,希望在下一个fortran版本中可以实现。
猜你喜欢
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 2023-02-26
  • 2014-07-25
  • 2019-07-05
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
相关资源
最近更新 更多