2016-06-10 18 views
2

Fortran 90 wird unter AIX ausgeführt. Der Versuch, diesen Code zu kompilieren und auszuführen, und ich erhalte eine Fehlermeldung, die besagt:Fortran-Fehler: Einheit mit formatierter Datei verbunden

The unformatted I/O statement on unit 200 cannot be completed because the unit is connected to the formatted file /filepath/TB_20160610023926_bufr_v620.dat. 
The program will recover by ignoring the I/O statement. 

Ich bin nicht ganz sicher, was dieser Fehler bedeutet. Ich öffne die Datei nur einmal und die Gerätenummer ist nicht mit einer anderen Datei verbunden.

INTEGER,PARAMETER :: GRID_TB_UNIT = 200 
tbhmap=0 

CALL SYSTEM('mkdir -p ' // TRIM(data_path) // '/' // & 
         TRIM(TB_PREFIX) // '/' // & 
         date_str) 

OPEN(UNIT = GRID_TB_UNIT,    & 
    file = TRIM(TB_binary_filename), & 
    STATUS = 'REPLACE',     &  
    ACCESS = 'SEQUENTIAL',    & 
    FORM = 'FORMATTED')       

nrecg = 0 
DO rr=1,720 
DO cc=1,1440 

    IF(countgrid(cc,rr) < 1)CYCLE 

    nrecg = nrecg+1 

    tbhmap(cc,rr) = tbhgrid(cc,rr)/countgrid(cc,rr) 
    timemap(cc,rr) = timegrid(cc,rr)/countgrid(cc,rr) 

    GRID_TB_record%row = rr 
    GRID_TB_record%col = cc 
    GRID_TB_record%year = yeargrid(cc,rr) 
    GRID_TB_record%month = monthgrid(cc,rr) 
    GRID_TB_record%time = timemap(cc,rr) 
    GRID_TB_record%tbh425 = tbhmap(cc,rr) 

    WRITE(GRID_TB_UNIT,REC=nrecg)GRID_TB_record 

END DO 
END DO 

CLOSE(GRID_TB_UNIT) 
+0

@HighPerformanceMark Dies führte zu einem weiteren Fehler: 'Der REC = Specifier darf nicht in einer Listen- oder Namelist-Datenübertragungsaussage erscheinen. – kkd92

Antwort

3

Form einer Verbindung zu einer Datei in Fortran ist entweder „formatiert“ (gemeint menschliche lesbar sein) oder „UNFORMATTED“ (nicht vom Menschen lesbarer). Die zulässige Syntax einiger Eingabe-/Ausgabeanweisungen hängt von der Datei ab - beispielsweise haben FORMATTED-Eingabe-/Ausgabeanweisungen immer einen Formatspezifizierer irgendeiner Art. UNFORMATTED-Eingabe-/Ausgabeanweisungen dürfen keinen solchen Spezifizierer enthalten.

Sie haben die Verbindung zu der Datei als FORMATTED geöffnet, aber dann hat die problematische WRITE-Anweisung nicht den erforderlichen Formatbezeichner - d. H. Die Syntax der WRITE-Anweisung ist die für eine UNFORMATTED-Verbindung. Ohne einen Formatbezeichner weiß der Compiler nicht, wie die Werte der Elemente in der Ausgabeliste für die WRITE-Anweisung in lesbarer Form dargestellt werden.

Wenn die Datei FORMATTED - für Menschen lesbar - formatiert werden soll, fügen Sie der WRITE -Anweisung einen geeigneten Formatbezeichner hinzu (ein Formatbezeichner von *, wie in den Kommentaren empfohlen, gibt ein prozessorabhängiges Format basierend auf dem Typ an die Argumente in der Ausgabeliste werden verwendet). Wenn Sie nicht möchten, dass die Datei für Menschen lesbar ist, ändern Sie das FORM in der OPEN-Anweisung in UNFORMATTED.

~~~

ähnlich wie die Inkonsistenz zwischen der Form einer Verbindung und der Syntax der Eingabe/Ausgabe-Anweisungen, gibt es auch eine Inkonsistenz zwischen dem Zugriff durch den Anschluss und die Anweisungen. ACCESS bezieht sich auf die Art der Datensätze in der Datei (und wie auf diese Datensätze dann "zugegriffen" wird): "SEQUENTIAL" - die Datei enthält Datensätze unterschiedlicher Länge, auf die nacheinander zugegriffen werden kann, "DIRECT" - die Datei enthält feste Länge Datensätze, auf die in beliebiger Reihenfolge zugegriffen werden kann, und "STREAM" - die Datei kann grundsätzlich als Stream von Dateispeichereinheiten (aka Bytes) behandelt werden (FORMATTED STREAM-Dateien können auch eine Datensatzstruktur basierend auf dem Newline-Zeichen im Stream haben) .

In dem Beispiel wird der ACCESS für die Verbindung zu der Datei explizit als SEQUENTIAL nominiert. Das Auftreten des REC-Spezifizierers in der WRITE-Anweisung ("schreibe die Informationen zu diesem bestimmten Datensatz") stimmt jedoch mit einer DIRECT ACCESS-Verbindung überein. Diese Abweichung ist in einem standardkonformen Programm nicht erlaubt.

+0

Dies half wirklich bei der Klärung. Könnten Sie vielleicht erklären, was ACCESS bedeutet? Ich weiß, dass es als "direkt" definiert werden muss, eine Datensatzlänge zu definieren, aber ich bekomme Fehler, weil die E/A-Anweisung nicht abgeschlossen wurde, weil das Ende des Datensatzes erreicht wurde. – kkd92

+0

Es gibt auch eine Inkonsistenz mit dem ACCESS für die Verbindungen und die Spezifizierer in der Anweisung, die ich übersehen hatte. Weitere folgen. – IanH