2011-05-03 42 views
4

我想通過使用gfortran從源代碼構建它來獲得傳統的FORTRAN代碼。我終於能夠成功地構建它,但是現在我在運行時遇到了出界錯誤。我使用gdb並將錯誤追蹤到使用loc()內部函數。當我嘗試打印loc(ae)的值時,ae正在傳遞給我的整數值,在當前上下文中出現錯誤「無符號」loc。「我試着編譯ifort 11.x並用DDT調試,並得到相同的錯誤。對我而言,這意味着編譯器不知道內在的東西。如何處理不屬於標準的FORTRAN內部函數?

有一點讀物顯示loc本身不是F77標準的一部分,所以也許這是問題的一部分。我發佈了以下內在的定義,但我不知道如何將其實現到我的代碼中,因此可以使用loc()。

任何意見或我誤解我的問題?由於gfortran和ifort由於出界錯誤而在同一地點崩潰,但使用loc()的函數在兩個編譯器之間返回相同的大數字。這似乎有點奇怪,如果兩個編譯器爲loc返回相同的值,那麼loc()將不起作用。

用法:

iaddr = LOC(OBJ)

其中:

OBJ 是一個變量,數組,函數或子程序,其地址被通緝。 iaddr 是一個地址爲「obj」的整數。該地址與LARn 指令存儲的格式相同,格式爲 。

說明:

LOC來獲得的 東西的地址。在Fortran中返回的值不是 確實有用,但GMAP子例程可能需要 ,或者可能需要 非常特殊的調試。

回答

5

哦,不,它編譯的事實意味着loc由編譯器知道; gdb不知道它的事實僅僅意味着調試器不知道它(它可能不知道matmult的內在因素)。

loc是一種廣泛可用的非標準擴展。我討厭那些。如果你想要一些應該可以在任何地方工作的標準,c_loc,它是Fortran2003中Fortran互操作性標準C <的一部分,你可以使用它。它返回一個可以傳遞給C例程的指針。

如何使用loc調用的值?

+0

感謝您的迴應。進一步的調查顯示我祿可能不是問題。我有用Compaq VF 6構建的代碼的2個版本。1,忽略'數組超出界限'的錯誤,並因此停止運行。我使項目設置完全一樣,但行爲仍在繼續。我無法弄清楚這一點,可能只需移動到Windows並使用正在運行的預先存在的可執行文件即可。再次感謝。 – Bob 2011-05-04 16:22:59

0

Gfortran loc似乎與其他編譯器的數組有些不同。如果你正在使用它來檢查數組副本等,那麼可以更好地做第一個元素loc(obj(1,1))或類似的loc。這相當於我用intel思考的loc,但是在gfortran中,它給出了一些其他地址(因此兩個共享完全相同內存佈局的數組具有不同的loc結果)。

相關問題