2016-09-28 4 views
1

Ich habe ein Programm geschrieben, das einen Integer-Wert aus einer Datei mit der OPEN-Anweisung liest und den Wert auf der Konsole ausgibt.Ich habe einen Segmentierungsfehler gefunden Fortran beim Lesen von Datendateien von einer externen Quelle

Während des Kompilierens scheint es in Ordnung und hat keine Probleme, aber wenn ich das Programm ausführen, habe ich einen Segmentierungsfehler festgestellt.

Ich habe den Code überprüft und bis jetzt habe ich keine Regeln verletzt. Kann mir jemand eine Idee zu diesem Problem geben?

Fehler:

Code:

program project5_03 
implicit none 
integer :: n = 0 
open (unit = 21, file = 'trial.txt', status = 'old') 
read (21,*) n 
print '(1x,a,i4)', "this is the value of n", n 
stop 
end program 

Der Inhalt der txt-Datei ist nur die Zahl "1234" auf der ersten Zeile.

+2

Es ist sehr wichtig zu zeigen, wie Sie den Code kompilieren. Das Backtrace ist sehr verdächtig, es wäre sinnvoller mit '-g -fbacktrace' oder ähnlichem. –

+0

haben Sie erfolgreich noch einfachere Codes kompiliert und ausgeführt? – agentp

+0

Verwenden Sie bitte den 'newunit'-Spezifizierer in Ihrer 'open'-Anweisung. Hardcoding-Dateiidentifikationseinheiten sind unglaublich fehleranfällig. – jlokimlin

Antwort

0

Hmmm, der Code sollte funktionieren. Es wäre schön gewesen, wenn Sie uns auch die Compiler-Version und -Optionen gegeben hätten. Ich meine, da ist die Sache, dass du die Datei, die du geöffnet hast, nicht schließt, aber da das Programm sowieso beendet wird, sollte das kein großes Problem sein.

Was ich tun würde, ist den Fehlerstatus verwenden und -Nachricht Variablen, etwa wie folgt:

program project5_03 
    implicit none 
    integer :: n 
    integer :: ios 
    character(len=200) :: iomsg 
    open (unit=21, file='trial.txt', status='old', iostat=ios, iomsg=iomsg) 
    call check(ios, iomsg, "OPEN") 
    read (21,*, iostat=ios, iomsg=iomsg) n 
    call check(ios, iomsg, "READ n") 
    write(*,'(1x,a,i4)', iostat=ios, iomsg=iomsg), "this is the value of n", n 
    call check(ios, iomsg, "WRITE to STDOUT") 
    stop 
contains 
    subroutine check(ios, iomsg, op) 
     implicit none 
     integer, intent(in) :: ios 
     character(len=*), intent(in) :: iomsg, op 
     if (ios == 0) return 
     print*, "Encountered Error ", ios, " during ", op 
     print*, iomsg 
     stop 
    end subroutine check 
end program 

Vielleicht wird dies Ihnen helfen, den Fehler zu finden.

Es gibt auch die Tatsache, dass Sie integer :: n = 0 verwenden - was kein Problem mit dem Hauptprogramm sein sollte, aber in Subroutinen bedeutet dies das SAVE Attribut.

+0

Vielen Dank. Ich konnte das beheben, indem ich meinen Compiler änderte, wie es der Fortran-Experte im Facebook vorgeschlagen hatte. :) Ich muss von TDM gfortran nach Cygwin basierend auf Fortran wechseln .... Danke – DarkChemist

Verwandte Themen