2013-07-19 77 views
0

我正在處理崩潰的代碼。我意識到編譯後的程序在釋放變量時會崩潰,但我不知道如何解決它。釋放聲明導致崩潰

當我運行的代碼,從Windows彈出似乎說:

main.exe has stopped working. Windows can check for a solution to the problem.

和編譯器顯示消息Process returned -1073740940 (0xC0000374) execution time : 1.171 s

婁存在的代碼示例:

Subroutine PoissonCode() 
Use Mesh 
Implicit none 
Real(8), Allocatable :: u(:,:),v(:,:),p(:,:) 
Character(50) :: Nome 
Allocate(u(0:Imax,0:jmax),v(0:Imax,0:jmax),p(0:Imax,0:jmax),fx(0:Imax,0:jmax),fy(0:Imax,0:jmax)) 
Allocate(xd(0:Imax),yd(0:Jmax)) 

........Code Here............... 

Deallocate(u,v,p,fx,fy,xd,yd) 
Deallocate(xd,yd) 

End Subroutine PoissonCode 

我把完整代碼here作進一步調查。 我也嘗試在Windows 7 x64和Windows XP x86中運行不同版本的GFortran的代碼,但沒有成功。

編輯:

代碼正確的一端是:

... 

Deallocate(u,v,p,fx,fy) 
Deallocate(xd,yd) 

End Subroutine PoissonCode 

截至日期:

我測試了不同的編譯器代碼(英特爾視覺Fortran語言)和仍然沒有成功。

+0

A **系統**崩潰?如[BSOD](http://en.wikipedia.org/wiki/Blue_Screen_of_Death)?如果不是,請不要這樣聲稱。 – user2246674

+0

我在'deallocate'之前和之後放了'pause'語句。這讓我得出結論,釋放可能是崩潰的原因。 – Eleteroboltz

+0

@HighPerformanceMark:不久前我有一個類似的問題:http://stackoverflow.com/questions/17452243/stalling-at-deallocate。 –

回答

1

D'Joey:嗯(我們所有的人)

Deallocate(u,v,p,fx,fy,xd,yd) 
Deallocate(xd,yd) 

在第二行,你的程序(嘗試)解除分配變量已經釋放在第一線。我想有時候閱讀代碼是值得的。

deallocate有可選參數staterrmsg它可以用來捕捉這類錯誤,並提供一個替代程序崩潰的默認行爲。

+0

對不起,你是對的,但是我在制定這個問題時在這裏輸入了錯誤。我原來的代碼沒有這個雙Deallocated變量。我試圖使用你提到的可選參數,但代碼在我能夠看到錯誤參數之前停止。 – Eleteroboltz

+0

好的...我發現了錯誤。子程序'PoissonCode'內的代碼正在訪問無效的數組位置。非常感謝你的幫助。 – Eleteroboltz

+0

是的,再次查看你的代碼,你在子程序'PoissonSolve'中有'p(0:imax,0:imax)',但在'PoissonCode'子程序中聲明瞭它'p(0:imax,0:jmax)' 。 –