当我这样做时,我遇到了非常奇怪的行为。我认为这是问题的根源,但我可能是错的。如果你们中的任何人都能证实这确实是未定义的行为,我至少会知道发生了什么
假设我(不假装编译)
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
我的问题是:我做的事情很奇怪吗?我觉得意图(out)取消定义整个块,即使我通过了一个切片,我需要一个inout。你能从标准中确认吗?
编辑:inout提供相同的未定义行为,但将非切片数组传递给Sub工作。这是否意味着传递切片数组以初始化子块是违反标准的?
由于
答案 0 :(得分:2)
首先,如果你传递一个切片,我怀疑你需要使用intent(inout),因为你不会分配整个数组,虽然我不完全确定,但意图(out)可能在这种情况下是正确的。
但问题的根源不在于您是否犯了在子程序中使用假定形状数组而没有显式接口或将其放入模块的错误?或者你省略了那部分代码?
我为你的代码添加了一个显式接口,分配1到块,编译,然后我可以定义任何类型的切片,它被正确设置为0.所以如果你正确地做事,也许你应该详细说明什么你正在看到的那种未定义的行为?