評價: 4 回應: 2 閱覽: 241
置頂

主程式 call subroutine 會爆掉的原因

編譯後錯誤訊息:

forrtl: severe (157): Program Exception - access violation

除錯的結果,我認為跟記憶體使用限制有關,但不清楚原因,想請教板上的前輩


下面是我碰到的情形,我用簡單的語法表示


程式1  可執行成功

 

real(8) :: A(512,512,512)

A = 1d0

call sub(512,512,512,A)

A = A+A



程式2  執行失敗

real(8) :: A(512,512,512)

A = 1d0

call sub(511,511,511,A(1:511,1:511,1:511)

A = A+A            <-在這步會出現錯誤訊息

=======================================

subroutine sub(n1,n2,n3,A)
implict none
integer,intent(in) :: n1,n2,n3
real(8),intent(in) :: A(n1,n2,n3)
end subroutine


副程式本身並無任何作用

所以認為是呼叫副程式時,傳入資料導致主程式記憶體空間出現問題

但不了解傳入整個陣列A 與 部分陣列A(1:511,1:511,1:511)

因為我的理解,subroutine 是傳送記憶體位置,並非傳送值

為何後者會導致錯誤發生,希望有經驗的前輩可以指教,謝謝

熱門回應

我設A(11,11,11)這樣的矩陣大小

兩種方法都可以執行

如果設成512會顯示記憶體不足

所以應該是記憶體不足所造成的問題

主程式裡宣告了A的大小傳給sub

但是sub裡又重新宣告了他的大小,而且大小不一樣

所以你要傳遞部份是可以的,但是需要另外寫一個叫B

B的大小要跟sub裡宣告的一樣

如果你是不想寫死array的大小,那就要用allocatable

但是用allocatable的話,就只能用module傳遞

事實上這就是為何你去看一堆老程式

老是宣告一個很大的array

然後主副程式都用共一個parameter來宣告大小

會員登入 (先登入會員才能回覆留言喔!)

Facebook留言