0

当我这样做时,我遇到了非常奇怪的行为。我认为这是问题的根源,但我可能是错的。如果你们中的任何人都可以确认这确实是未定义的行为,我至少会知道发生了什么

假设我有(不假装编译)

subroutine X
  real, allocatable :: block(:,:)
  allocate(block(20,20))

  call Sub(block(1:5, 1:5))
! here is undefined behavior
end subroutine

subroutine Sub(b)
   real, intent(out) :: b(:,:)
   b = 0.0
end subroutine

我的问题是:我在做一些奇怪的事情吗?我觉得意图(出)未定义整个块,即使我通过了一个切片,我也需要一个 inout。你能从标准中确认吗?

编辑: inout 给出相同的未定义行为,但将非切片数组传递给 Sub 有效。这是否意味着传递切片数组来初始化子块是违反标准的?

谢谢

4

1 回答 1

2

首先,如果你传递一个切片,我怀疑你需要使用 intent(inout) 因为你不会分配整个数组,虽然我不完全确定,intent(out) 可能是正确的这个案例。

但是,您的问题的根源不在于您在子例程中错误地使用了假定形状的数组,而没有显式接口或将其放入模块中吗?还是您省略了那部分代码?

我在你的代码中添加了一个显式接口,将 1 分配给块,编译,然后我可以定义任何类型的切片,它被正确设置为 0。所以如果你做的事情正确,也许你应该详细说明什么样的未定义你看到的行为到底是什么?

于 2010-12-04T00:23:49.353 回答