2015-04-07 49 views
1

我在運行使用其他計算機時沒有問題的代碼時出現運行時錯誤。保存變量時結束記錄錯誤

我想知道如果問題是這臺機器的Fortran編譯器(GCC 4.9.2),因爲前一臺計算機使用以前的版本。

問題定義這樣一個變量,當說到:

在模塊I定義

character(30),allocatable,save :: sceneclass(:) 
在子程序 sceneclass

然後根據

character(30) surf, frac, scene 

allocate(sceneclass(10)) 

do i=1,10 
write(sceneclass(i),*) trim(scene)//trim(surf)//'_'//trim(frac) 
enddo 

在第一次迭代中定義我得到了「唱片結束」。但我不知道問題在哪裏。它似乎在其他電腦上工作正常。

+0

「scene」的值是什麼?衝浪「和」壓裂「?這是可能的,你將不得不創建一個完全可編譯的例子。 –

回答

1

您可能正在寫一個字符串爲sceneclass(i),它比您指定的30個字符長。

我可以重現這與

program test 
    implicit none 
    character(10),allocatable :: sceneclass(:) 
    integer     :: i 

    allocate(sceneclass(10)) 

    do i=1,10 
    write(sceneclass(i),*) 10**i 
    enddo 

    print *, (trim(sceneclass(i)), i=1,10) 

end program 

gfortran失敗

Fortran runtime error: End of record

ifort報告錯誤正確:

output statement overflows record, unit -5, file Internal List-Directed Write

增加字符串的長度,以12解決問題這個案例。您可以(也應該)在write聲明中使用iostat來捕獲此內容。

+0

我在GCC站點創建了一個[功能請求/錯誤報告](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65684)。 –

+0

這是問題。出於同樣的原因,使用以前的gcc fortran版本的空白不是問題。謝謝! – cardogar

+0

@cardogar空白不應該是一個問題!順便說一句,這就是爲什麼我問你寫什麼變量,因爲它看起來像一個溢出。您應該始終在您的問題中提供完整的信息。我不認爲錯誤信息是錯誤的,它與intel的差不多。 –

1

有一點需要注意,當你指定一個指向列表*寫入一個字符串時,編譯器總是(?)增加一個額外的前導空白,所以你可以寫的字符串的有效長度是一個小於你可能會期望。

爲了彌補這方面(當然假設你不想帶頭空白反正)使用字符串編輯描述:

write(sceneclass(i),'(a)')... 

有趣ifort(Linux的11.1)實際上允許你通過一個字符超限:

character*5 c 
write(c,*)'12345' ! result: " 1234" 

我會考慮一個錯誤。他們似乎忘了算空太..(gfortran拋出這個上面的錯誤,如果你添加一個或多個字符ifort不太願意)

看到這裏,如果你想知道爲什麼空白.. Are Fortran control characters (carriage control) still implemented in compilers?

和現在我很好奇,如果某個編譯器某處沒有爲內部列表寫入,或者您的代碼之前編譯了一個標誌來禁用「打印機控制」代碼