2016-03-29 8 views
0

Ich versuche, einen alten Code zu modernisieren (oder zumindest ein wenig verständlicher), aber ich habe in einem ungeraden Format für eine, äh, FORMAT-Anweisung laufen.Old Fortran: Hollerith Edit-Deskriptor-Syntax für Format-Anweisung

Insbesondere ist es eine Anweisung mit FORMAT Hollerith Konstanten in sie (die nHn wo eine Zahl ist):

FORMAT(15H ((C(I,J),J=1,I3,12H),(D(J),J=1,I3, 6H),I=1,I3,') te'   
1,'xt' ) 

Dies verwirrt mit der Syntax-Markierung, wie sie erscheint dies nicht geschlossene Klammer hat. Es kompiliert gut mit dieser Formatanweisung wie es ist, aber Schließen der Klammer verursacht einen Kompilierungsfehler (mit dem Intel oder Gfortran-Compiler).

Wie ich es verstehe, war Hollerith-Konstanten eine Kreatur von 66 Fortran und wurden mit dem Aufkommen der CHARACTER in Fortran 77. Ich im Allgemeinen ihnen, wenn sie als so etwas wie ein Zeichen verwendet verstehen ersetzt, aber die Verwendung als FORMAT mich verwirrt.

Weiter, wenn ich 15H ((... zu 15H ((... ändern (d. H. Ich entferne ein Leerzeichen) wird es nicht kompilieren. In der Tat wird es nicht kompilieren, selbst wenn ich den Code dies zu ändern:

FORMAT(15H ((C(I,J),J=1,I3,12H),(D(J),J=1,I3, 6H),I=1,I3,') text' ) 

Ich möchte dies in einem normaleren (F77 +) Format statt sein. Jede Hilfe wird geschätzt.

Antwort

5

Was haben Sie eigentlich Hollerith bearbeiten Deskriptoren, nicht Konstanten (die in einem DATA oder CALL-Anweisung auftreten würde), obwohl sie die gleiche Syntax. F77 ersetzte Hollerith-Konstanten vollständig; Er fügte char-literalen Editierdeskriptor als (viel!) bessere Alternative hinzu, aber der H-Editierdeskriptor blieb bis F95 im Standard (und selbst dann akzeptierten einige Compiler ihn noch als Kompatibilitätsmerkmal).

In jedem Fall, die Zahl vor der H nimmt diese Anzahl von Zeichen nach der H, ohne andere Begrenzer; Deshalb wird ein Zeichen nach dem H gelöscht (oder hinzugefügt). Parsen Ihr Format bricht es in diese Stücke

15H ((C(I,J),J=1, 
I3, 
12H),(D(J),J=1, 
I3, 
6H),I=1, 
I3, 
') te' 
'xt' 

und damit ein modernes Äquivalent (mit optionaler Räume für Klarheit) ist

nn FORMAT(' ((C(I,J),J=1,', I3, '),(D(J),J=1,', I3, '),I=1,', I3 
    1,') text') 

oder wenn Sie es vorziehen Sie, dass der Text nach Fortsetzung setzen können (einschließlich der Pars) in einem CHARACTER-Wert, einer Variablen oder einem Parameter, die in der E/A-Anweisung anstelle einer FORMAT-Bezeichnung verwendet werden, aber da Sie alle Anführungszeichen verdoppeln müssen, um sie in einem CHARACTER-Wert zu erhalten, der weniger praktisch ist.

Ihre All-on-Line-Version wurde wahrscheinlich nicht kompiliert, weil Sie eine feste Form verwendet haben, vielleicht standardmäßig, und nur die ersten 72 Zeichen jeder Quellzeile werden in fester Form akzeptiert, von denen die die ersten 6 sind für die Anweisungsnummer und den Fortsetzungsindikator reserviert, so dass nur 66 übrig bleiben und diese Aussage bei meiner Zählung 71 ist. Praktisch jeder Compiler, den Sie heute finden, akzeptiert auch Free-Form, was längere Zeilen erlaubt und auch andere Vorteile für neuen Code hat, aber Änderungen im bestehenden Code erfordern kann, manchmal umfangreiche Änderungen.