上週寫了個程式,大致結構是主程式呼叫多個模組中的例程。宣告瞭一個動態陣列,期望實現的功能是透過子程式讀取檔案資料,寫入陣列,然後透過該陣列傳出。該陣列在主程式中宣告如下:
real(8), allocatable:: array(:)
在例程中宣告如下:
real(8), allocatable, intent(out):: array(:)
由於該陣列並沒有初始值,當時想著只是作為傳出資料用,於是為其賦予了intent(out)屬性,結果執行到此喚起了Access Violation。經過一番debug,發現錯誤出現在read語句,也就是訪問陣列的地方。該陣列在主程式中成功分配,在例程中用allocated()檢查,返回的是F。看來是intent(out)屬性導致的。
結論:如果想要從子程式中訪問一個動態陣列,要麼在子程式內分配,要麼在主程式中分配之後傳參進來,而且必須是intent(in)或(inout)。對於intent(out)這個屬性,不僅僅是值傳遞不進來,分配狀態也傳遞不進來。