2011-01-05 61 views
0

我試圖檢查某些行有多少次在幾分鐘的時間步執行的,這裏是我的代碼部分: 1)寫「COUNT天」每次:與比較整數很奇怪FORTRAN錯誤

real(kind=8) function dergfm(jp,ip,lp) 
integer :: jp,ip,lp,countd 
real(kind=8) press 
    . 
    . 
    . 
    countd=countd+1 
    !if (countd < 5) then 
    print*, "countd= ", countd 
    !endif 
    . 
    . 
    . 
end function dergfm 

結果:

countd=   1 
. 
. 
. 
countd=   21504 

2)寫上 「COUNT天」 第一4次:

real(kind=8) function dergfm(jp,ip,lp) 
integer :: jp,ip,lp,countd 
real(kind=8) press 
    . 
    . 
    . 
    countd=countd+1 
    if (countd < 5) then 
    print*, "countd= ", countd 
    endif 
    . 
    . 
    . 
end function dergfm 

結果:

countd=   1 
countd=   2 
countd=   3 
countd=   4 

3)寫 「COUNT天」 大於5個

real(kind=8) function dergfm(jp,ip,lp) 
integer :: jp,ip,lp,countd 
real(kind=8) press 
    . 
    . 
    . 
    countd=countd+1 
    if (countd > 5) then 
    print*, "countd= ", countd 
    endif 
    . 
    . 
    . 
end function dergfm 

結果:

[none] 

看起來比較這些整數工程.LT。但不適用於.gt。 (也就是說)

+1

您確定輸入和所有全局變量對於每次運行都是相同的嗎?如果是這樣,看起來你已經碰到了一些非常奇怪和錯誤的東西。但是,爲了演示,你必須令人信服地表明其他一切都沒有改變。如果你忽略了用點表示的材料,毫無疑問它能正確執行。您需要保存當前的測試用例,然後將代碼量減少到最小,仍然會重現問題。然後將錯誤報告提交給編譯器供應商。 (裸露的最小值應該是50行或更少,只是爲了給你一個目標。) – 2011-01-05 13:51:30

+0

@J。 Leffler:雖然編譯器錯誤當然是可能的,但在99.9%的情況下,罪魁禍首是在用戶代碼中,例如,在這種情況下,某些數組邊界錯誤會被計數。或者我們看不到的其他東西,因爲它隱藏在「...」部分後面,OP不想分享。 – janneb 2011-01-05 14:59:46

+0

感謝所有的答案,我將檢查您的建議,我沒有發佈代碼,因爲它是非常廣泛的(100k +行)計算代碼。最令我震驚的是<作品但不是>或== – madness 2011-01-10 09:24:03

回答

2

countd是一個函數的局部變量。因此,除非在聲明中添加「保存」屬性,否則其值不一定保留在調用之間。試試這個,看看代碼是否開始行爲。你如何初始化計數?我會用以下內容:

整數,節省:: COUNT天= 0

在這種情況下,「拯救」,因爲它是通過在聲明中初始化暗示是可選的。

+0

事實證明,簡單地寫作「integer :: countd = 0」是可行的,但它仍然超出了我爲什麼IF語句中的「==」不起作用。 ..感謝所有的幫助,我不會試圖消化它 – madness 2011-01-10 13:33:57

0

如果變量沒有保存,行爲是不確定的,奇怪的事情可能發生。 對於某些編譯器,COUNTD的值將初始化爲0,代碼 將按預期工作。對於其他編譯器,每調用一次子程序 就會得到完整的垃圾。

其他時間(我懷疑是你的情況),變量放在堆棧上,每次調用子程序時都會分配相同的內存。或者,可能會得到 第4次或第5次分配相同的內存,然後其他子程序在第6次破壞堆棧,並且COUNTD的值變爲垃圾。

正確答案是保存變量並用數據語句初始化它。 這是便攜式,將在每個系統上工作。