2013-05-16 79 views
0

我有一個Fortran 95代碼,其輸出似乎是它不應該是一個函數的功能。具體而言,正在發生以下scenerio:程序的輸出取決於任意的打印語句?

  • 運行代碼與版本A;它不起作用(我的意思是,它在編譯和運行時起作用,但它不能提供我期望的結果)

  • 運行帶版本B的代碼;有用。版本B僅包含對版本A的簡單修改,如打印語句或變量數值的小改動。

  • 使用版本A運行代碼;突然間,它工作。

我覺得有一些問題與內存或使用變量,他們正在初始化之前,所以我想知道是否有是檢查這樣的事情與gfortran的方式,或者如果任何人知道問題可能是。我試過gfortran my_program.f95 -Wall - Wextra,但它只是給了我一些關於不合格製表符的抱怨。

+4

我建議你嘗試切換運行時數組邊界檢查(我認爲編譯器標誌是'-fbounds-check' for gfortran,但它不是我經常使用的編譯器,所以請查閱文檔)。正如你所總結的那樣,如果插入print語句似乎可以修復你的程序,那肯定會出錯。根據我的經驗,走出數組的末端是您報告症狀的可能原因之一。 –

+0

嗯,這是一個好點,但'-fbounds-check'似乎沒有任何問題。 –

+0

在這種情況下,找出編譯器選項以在編譯時檢查例程接口。我不知道該選項可能是什麼。如果它告訴你'-Wall'打開所有編譯時警告,那麼不要相信你的直覺,它可能不會。 –

回答

0

這是一段時間以前,但我解決了這個問題,所以我想我可能會發布它。說實話,我不知道具體這些步驟是否是什麼固定它,但它的作品,所以在這裏,他們是:

  1. 放入模塊中的所有程序(這也有助於組織代碼)而不是「公開」。

  2. 經由real, intent(in) :: foo聲明所有變量的意圖(inoutinout)。這對於優化和組織顯然是有用的,但顯然它也與接口有關......不知道這是關於什麼的。

就是這樣!