2015-07-12 65 views
3

我創建了一個可分配數組。我分配元素,然後打印數組的大小。我感到奇怪的是,釋放後大小保持不變。解除分配後的數組大小

Integer, Allocatable :: fred(:) 
    Allocate (fred(3)) 
    Write (*,*) "fred: ", Size (fred) 
    Deallocate (fred) 
    Write (*,*) "fred: ", Size (fred) 
+1

這不是有效的Fortran代碼:您獲得的任何結果都可以用於Fortran處理器。 – francescalus

+0

你在說什麼? – Zeus

+0

我已經回答了,但我確實對你相信正確的輸出感興趣。 – francescalus

回答

10

這是一個正在呼喚一個規範的問題,真的。爲了在不存在的情況下回答你的具體問題(據我所知,但我最終可以寫出一個問題),我會回答。

size的參數不能是未分配的可分配變量。

對於您的代碼fred是一個可分配的變量。如果該代碼塊被執行,則在最後一行size上有一個參數,它是一個未分配的可分配變量。在這種情況下,如果它構成程序(程序單元)的一部分,那麼程序(程序單元)不是標準的程序(程序單元)。

這種缺乏一致性並不是缺乏Fortran處理器要求檢測爲符合Fortran處理器的一致性。

是的,這對處理器來說很好,它會在編譯時選擇合適的選項。按照流行的說法,一個標準的符合處理器將被允許啓動第三次世界大戰來響應這個代碼。它也可能打印3。這完全取決於編譯器供應商的心血來潮。

由評論提示,更多信息。

這很誘人,也許,預計解除分配數組的大小爲零。但是,釋放數組和零元素的數組是完全不同的東西,就像零長度的字符與未分配的可分配字符不同一樣。

特別是,我們有一個像

fred = [fred, append] 

成語時,不分配fred這是無效的,但是當它被分配但大小爲0的有;在後一種情況下不需要特殊處理。

我同意High Performance Mark的評論,如果編譯器要返回任何值,0是一個不好的選擇。很大程度上,尺寸沒有明確定義,例如根據返回的尺寸訪問fred(3)也是一個壞主意。同樣,編譯器可以自由地給這個引用賦予任何特定的值。

最後,如果你想檢查一個數組是否被分配,你應該使用allocated內在的而不是依賴size返回0。當然,在這種情況下,這是不需要的,因爲您可以確定在deallocate聲明fred確實未被分配之後。

在Fortran 90中,分配狀態可能未定義,然後甚至不允許allocated

+0

你總是可以用'分配(fred')檢查 – Zeus

+0

我使用分配來檢查,但是,當程序調用刪除程序,我想告訴他,有沒有數據可用,所以我表現出值爲0。他然後可以用他想要的數據填充它。 – Zeus

+0

有可能是一個隱含的問題,我沒有注意到(我傾向於沒有注意到任何問題的背景 - 這是我的錯)。如果你能更清楚地解釋你想要的是什麼,我會再次嘗試回答。然而,從根本上說,一個非分配數組應該(通過編譯器和程序員)與大小爲0的分配數組的處理方式完全不同。 – francescalus