2010-12-03 33 views
0

當我這樣做時,我遇到了非常奇怪的行爲。我認爲這是問題的根源,但我可能是錯的。如果你們中的任何可以證實這確實是不確定的行爲,我至少知道發生了什麼事情Fortran 90中intent(out)拼接數組的未定義行爲?

想我已經(不假裝編譯)

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作品。這是否意味着爲了初始化子塊而傳遞分片數組是違反標準的?

感謝

回答

2

首先,如果你通過一個片,我懷疑你需要使用意圖(INOUT),因爲你不會給整個數組分配,雖然我不能完全肯定有關,意圖(out)在這種情況下可能是正確的。

但是,不是你的問題的來源是你犯了一個錯誤的假設形狀的數組在子程序中沒有明確的接口或把它放在模塊中?或者你是否忽略了那部分代碼?

我爲你的代碼添加了一個明確的接口,分配了1來阻塞,編譯,然後我可以定義任何類型的slice,它被正確設置爲0.所以,如果你正確地做了事情,也許你應該詳細說明你究竟看到了什麼樣的未定義行爲?

+0

我有一個明確的接口。我剛剛省略了手頭問題的不相關代碼。未定義的行爲釋放(或重新分配,或將其發送給隨機存儲器)包含在一個類型中的指針,該類型根本不被代碼觸及。 – 2010-12-04 11:14:54