2016-04-01 28 views
1

: Öncelikle bu kodu çalıştırdığınızda"Segmentasyon hatası" açık varolan bir dosya Ben basit bir kod çalıştırıyorum

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 

, Tamam oldu ve SumData.dat dosyayı oluşturdu. Tekrar çalıştırdığınızda Ama, hata aşağıdaki açık emrinde durup gösterecektir:

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 

Ben SumData.dat dosyayı silmek ve yeniden çalıştırın, Tamam oldu. Programın neden mevcut dosyaları açamadığını bilen var mı? Bununla

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

, sen, yazma için açık bir dosyayı çalışıyoruz belirtmek gerekirse onun yerine:

+0

Sorununuz, Fortran Standardının belirli bir sürümüne özgü olmadıkça lütfen jenerik [tag: fortran] etiketini kullanın. Kesinlikle kendinizi 25 yaşındaki bir Fortran versiyonuyla sınırlamak istemezsiniz. –

+0

Veri dosyası nasıl görünüyor? –

+0

Merhaba Vladimir, eğer herhangi bir veri dosyası yoksa, program bir tane oluşturacak ve toplamı sonuçları yazılacak: Toplama = 2 – elpdotaer

cevap

1

Hep en dosyayla yapmaya çalışıyorsun tam olarak ne belirlemek için iyi bir fikirdir. status belirtmezseniz, derleyici en iyi gördüğü her şeyi yapmakta serbesttir - bu sizin başarısızlığınıza neden olabilir. Aynı şey action specifier için de geçerlidir. Ayrıca, open işleminin dönüş değerini kontrol etmek için iostat=<some integer var> kullanmalısınız. Ardından, yaşadığınız gibi çirkin çalışma zamanı hatalarını önleyebilirsiniz.

+0

Merhaba Alexander, cevabınız için çok teşekkürler. Profesyonel olmayan kod formatım için özür dilerim. Önerinizi denedim ama yine de aynı hataları gösteriyor. Sonra IOSTAT ve ERR'yi aşağıdaki gibi kullanmaya çalıştım: open (birim = 10, dosya = "SumData.DAT", status = 'replace', action = 'write', iostat = b, err = 100) 100 devam write (*, *) b Program hala açık komutta durduruldu. Bana biraz daha önerebilir misiniz? Teşekkürler. – elpdotaer

0

Code :: Blocks 17.12 ile birlikte gelen gfortran sürüm 5.1.0 sürümünü kullanmaya çalışırken aynı sorunu yaşadım. this github issue'a göre, sürümle ilgili bir sorun gibi görünüyor.

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

Kod main.f90 yılında, yeniden:

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 

ile derlenmiş ve çalışan

touch tmp.dat && ./a.out 

İade

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

Backtrace for this error: 
#0 ffffffff