2012-04-09 35 views
3

,可能的變動(千行,所以我會嘗試發佈的重要行),讓我:Fortran語言:我有一個Fortran代碼正在gfortran編譯的價值

nrev(isat)=dint((t_ref-t_in)/zper)+1 
      1 
Warning:Possible change of value in conversion from REAL(8) to INTEGER(4) at (1) 

它們被初始化爲:

integer*4 nrev(nmaxsat) 
integer*4 isat 
real*8  t_ref 
real*8  t_in 
real*8  zper 

有關如何解決此問題的任何想法? 謝謝!

+0

你想修正什麼?根據雙精度表達式的大小,它不能表示爲32位有符號整數。你期望發生什麼? – talonmies 2012-04-09 18:21:43

+0

當我運行完整的程序時,所有的輸出值都是NaN,所以我擔心這樣的警告是問題所在。在gfortran中編譯時我沒有錯誤,但在g77編譯時編譯和運行正確。我有幾個警告,但我專注於這一個希望如果我能得到幫助,我可以找出其餘的。 – 2012-04-09 18:28:19

+0

如果您正在獲取NaN值,則表示您在某處有無效的浮點計算。您顯示的代碼正在計算一個整數值。根據您發佈的內容,無法說明這兩者如何相關。 – talonmies 2012-04-09 18:40:27

回答

4

這是一個很好的主意,可以擺脫所有的警告,即使是次要的警告 - 即使只是這樣,當你得到更重要的問題,你看到他們,而不是輸出淹沒的小東西。

在這種情況下,警告信息相當清晰;你正在給一個整數賦一個double。 dint內部截斷,但它不轉換類型;所以你分配一個雙精度值,它的值被截斷爲一個整數。你可以正確地注意到內在命名被混淆了,但是...

如果你想做轉換以及截斷,idint實際上轉換爲整數。

因此,例如,該計劃

program foo 

    integer :: nrev 
    double precision :: t_ref 

    t_ref = 1. 

    nrev = dint(t_ref) 

end program foo 

產生同樣的警告:

$ gfortran -o foo foo.f90 -Wall -std=f95 
foo.f90:8.11: 

    nrev = dint(t_ref) 
      1 
Warning: Possible change of value in conversion from REAL(8) to INTEGER(4) at (1) 

但是這一次是罰款:

program foo 

    integer :: nrev 
    double precision :: t_ref 

    t_ref = 1. 

    nrev = idint(t_ref) 

end program foo 

,因爲我們看到:

$ gfortran -o foo foo.f90 -Wall -std=f95 
$ 
+6

除了使用特定的內在「idint」,您可以使用通用名稱「int」。使用泛型,編譯器會自動判斷從參數的類型中使用哪個函數,程序員不必記住名稱。 (還有第二個參數,您可以在其中指定函數返回的整數的類型。) – 2012-04-10 00:53:23

+0

非常感謝您的解釋!這將幫助我清理這些代碼並使其運行得更好。 我在上面的評論中詢問了這個問題,但是你能解釋一下「轉換中可能的價值變化」和「參數類型不匹配」警告之間的區別是什麼?他們似乎以兩種不同的方式說同樣的話......再次感謝! – 2012-04-10 13:33:51