2016-04-01 42 views
1

當我運行一個簡單的代碼:「段錯誤」,當打開現有的文件

program summation 
implicit none 
integer :: sum, a, b 

print*, "This program performs summations. Enter 0 to stop." 

!open(unit=10, file="SumData.DAT", status='replace', action='write',iostat=b, err=100) 
!100 continue 
!write(*,*) b 

open(unit=10, file="SumData.DAT", status='replace', action='write') 

sum = 0 

do 
print*, "Add:" 
read*, a 
if (a == 0) then 
    exit 
else 
    sum = sum + a 
end if 
    write(10,*) a 
end do 

print*, "Summation =", sum 
write(10,*) "Summation =", sum 
close(10) 

end 

當我先運行此代碼,也沒關係,它產生的SumData.dat文件。但是當我再次運行它,它會停在打開命令,並顯示以下錯誤:

Program received signal SIGSEGV: Segmentation fault - invalid memory reference. 

Backtrace for this error: 
#0 ffffffffffffffff 
#1 ffffffffffffffff 
#2 ffffffffffffffff 
#3 ffffffffffffffff 
#4 ffffffffffffffff 
#5 ffffffffffffffff 
#6 ffffffffffffffff 
#7 ffffffffffffffff 
#8 ffffffffffffffff 
#9 ffffffffffffffff 
#10 ffffffffffffffff 
#11 ffffffffffffffff 
#12 ffffffffffffffff 
#13 ffffffffffffffff 
#14 ffffffffffffffff 
#15 ffffffffffffffff 
#16 ffffffffffffffff 
#17 ffffffffffffffff 
#18 ffffffffffffffff 

如果我刪除了SumData.dat文件並再次運行它,它是確定的。有誰知道爲什麼程序無法打開現有的文件?

+0

請使用通用的[tag:fortran]標籤,除非您的問題特定於特定版本的Fortran標準。您當然不想限制自己使用25年前的Fortran版本。 –

+0

數據文件的外觀如何? –

+0

嗨弗拉基米爾,如果沒有數據文件,程序將創建一個,並將求和結果寫入如下: Summation = 2 – elpdotaer

回答

1

它總是能明確指定一個好主意,你正在嘗試與文件做:你指定你試圖打開一個文件進行寫操作,如果需要更換它

open(unit=10, file="SumData.DAT", status='replace', action='write') 

有了這個,。如果你沒有指定status,編譯器可以自由地做任何它認爲最好的事情 - 這可能會導致你的失敗。 action specifier也是如此。

此外,您應該使用iostat=<some integer var>檢查open操作的返回值。然後,您可以避免遇到醜陋的運行時錯誤。

+0

嗨亞歷山大,非常感謝您的回答。抱歉我的不專業的代碼格式。 我試過你的建議,但它仍然顯示相同的錯誤。 然後我嘗試使用IOSTAT和ERR如下: open(unit = 10,file =「SumData.DAT」,status ='replace',action ='write',iostat = b,err = 100) 100 continue 寫(*,*)b 程序仍停在打開命令。你能否給我多些建議?謝謝。 – elpdotaer

0

我嘗試使用版本5.1.0的gfortran版本時發生了同樣的問題,該版本隨附Code :: Blocks 17.12。根據this github issue這個版本似乎有問題。

[...] whatever the issue was it's fixed with GCC 5.2.

代碼重建,在main.f90

program main 
    IMPLICIT NONE 
    OPEN(10, FILE='tmp.dat', STATUS='OLD', ACTION='WRITE') 
    CLOSE(10) 
end program main 

編譯

gfortran -Wall -o a.out main.f90 

和運行

touch tmp.dat && ./a.out 

返回

Program received signal SIGSEGV: Segmentation fault - invalid memory reference. 

Backtrace for this error: 
#0 ffffffff