2010-03-12 19 views
1

在我的Fortran代碼我做了如下調用dnrm2常規:應該在Fortran中聲明外部例程嗎?

d = dnrm2(n, ax, 1) 

只是一個簡單的調用,將返回我double precision結果。

問題是,我應該在我的腳本開始時聲明函數嗎?我發現如果我沒有聲明它,當我在32位Windows中編譯代碼時,結果是正確的。

但是,如果我在64位Windows編譯代碼,那麼結果是不正確的。

這是爲什麼?外部例程是否必須在Fortran中聲明?

+0

什麼? downvote?我的問題有什麼問題? – Graviton 2010-03-27 16:41:27

+0

+1:這是一個有趣的問題 - downvote對我毫無意義。 – 2010-03-28 06:31:06

回答

3

如果您沒有正確描述調用程序的子程序(子例程和函數),編譯器可能無法正確調用它們。 Fortran分別編譯每個單元,因此編譯器默認不會「知道」其他子程序的特性。有幾種方法可以在Fortran 90/95/2003中描述/聲明子程序。

最簡單和最好的方法是將你的子程序放入一個模塊中,然後在調用程序中「使用」該模塊。這會自動使編譯器知道該接口,並使編譯器能夠檢查子程序中實際參數(在調用中)和僞參數的一致性。它還會使函數的返回類型變爲已知。模塊中的各種子程序具有彼此已知的接口。

您也可以編寫一個包含子程序聲明的「接口」,該子程序聲明與實際子程序的聲明相匹配。 (這種方法可以與C中包含頭文件的風格非常相似)。這種方法更加容易出錯,因爲無論何時進行更改,您都必須手動保持實際子程序和接口之間的一致性。當您沒有代碼到子程序或子程序用Fortran以外的語言編寫時,該接口方法很有用。

或者你可以簡單地聲明一個函數名來指定函數的類型返回,但是這不會給你任何參數檢查。在我看來,這種方法比較弱,因爲編譯器檢查參數一致性消除了一大類編程錯誤。

-1

我不做Fortran,但在C中,指針的大小和long int的大小在32位和64位操作系統之間不同,但int的大小不一樣。也許程序使用ints來做指針算術?

+2

好的,但是這與我的問題有什麼關係? – Graviton 2010-03-12 04:02:49