2014-12-05 84 views
3

下面的代碼編譯,但我不認爲它應該。正如你所看到的,輸出是垃圾。這個FORTRAN代碼不應該被編譯。它有這個原因嗎?

這是一個最小的失敗的例子,在我工作的一個大型項目中讓我困難。

我的問題是 - 爲什麼編譯器不抱怨?這是一個編譯器的限制,還是這種「預期的行爲」,我錯過了什麼?

我正在使用gfortran 4.6.3。

module dataModule 
    integer :: datum1 = int(1) 
    integer :: datum2 = int(2)  
end module dataModule 

program moduleTest 
    use dataModule, only: datum1 

    write(*,*) "datum 1 is", datum1 
    write(*,*) "datum 2 is", datum2 

end program moduleTest 

輸出示例:

datum 1 is   1 
datum 2 is 4.58322689E-41 
+5

你已經錯過了'隱式無'。沒有它的代碼是非常有效的,輸出是允許的。 – francescalus 2014-12-05 17:45:50

+2

書中最古老的招數:) – Rob 2014-12-05 17:46:11

+0

當然啊!多謝你們。它實際上比這更糟,我在(非常老!)代碼中編輯的模塊有 IMPLICIT REAL * 8(a-h,o-z) – carthurs 2014-12-05 17:49:24

回答

3

您的代碼是錯誤的,而不是編譯器。 如果datum2被使用關聯,儘管only子句和如果明確初始化datum2被忽略,那麼是的,那將是一個頑皮的編譯器。

雖然答案是非常普通的。

datum2未使用關聯:在沒有implicit none時,它是主程序中的隱式類型變量。 「垃圾」來自這樣一個事實,即在它的值被引用之前,它沒有通過初始化或賦值來定義,並且它是隱含的(默認)真實的。編譯器不需要在編譯(或運行)時間檢測到這個錯誤。

+0

這是什麼,@francescalus?在評論中回答幾個月後回到你的「接受答案」互聯網點上?哦,繼續;) 我所學到的是,與古代Fortran代碼一起工作的一個缺陷是它沒有任何「隱含的」,並且生命太短而無法接通正確輸入所有變量。所以我用C++重新編寫了它。 – carthurs 2015-06-08 16:20:20

+1

奇怪的部分是我在瀏覽器的標籤中打開了這個問題六個月。因此,可能會整理互聯網和我的桌面上的「未答覆」部分;)。 – francescalus 2015-06-08 16:29:04