- bessere
Dokumentationsmöglichkeiten ;
problemorientiert ;
maschinenunabhängig, daher portabler
Code ;
leichtere Programmierung
- Aus der
Größe des Objektcodes
(Codesegment) plus
der Größe des Datensegmentes.
In das Codesegment gehen sowohl die
übersetzten Anweisungen des
selbstgeschriebenen Programms als auch
der Code
der Routinen aus der Laufzeitbibliothek
(z.B. für Ein-/Ausgabe) ein.
Vergrößerungen des
Datenbereiches, z.B. durch
größere
Dimensionen von Feldern, gehen nicht
notwendig linear in die Größe
des Lademoduls ein.
- Mehrfachbenutzung
von Variablen (-namen).
Mehrfachnutzung von COMMON-Bereichen.
Mehrfachnutzung von Speicherbereichen mit
EQUIVALENCE.
Datenauslagerung auf Massenspeicher
(Platte) statt Halten im Arbeitsspeicher.
Sinnvolle, problemangepasste
Dimensionierung von Feldern.
- Eine statement
function ist eine besondere Art einer
Funktion. Sie
besteht aus einer einzigen Anweisung und
wird in einer Programmeinheit vor den
ausführbaren Anweisungen vereinbart.
Sie ist nur lokal gültig (wie die
interne Funktion und im Gegensatz
zur externen Funktion).
- Vor allen
DATA-Anweisungen,
Formelfunktionsdefinitionen und
vor allen ausführbaren Anweisungen.
- Ä ?
- Es enthält
Elemente
- Zum Besetzen von Konstanten, wobei der Compiler
überwacht,daß sie nicht verändert
werden, sowie zum eleganten Dimensionieren von Feldern.
- 10, 27, 2
- F F F T F F T T F F
- Die Standardfunktion
LEN alleine reicht nicht aus, da sie
nur die in der CHARACTER-Anweisung
definierte Länge des Strings ermittelt.
Eine mögliche Lösung lautet:
SUBROUTINE StrLen (String, NCLead, NCStr)
!---- --------------------------------------
!* Zweck: Subroutine zur Ermittlung der Anzahl fuehrender Leer -
! zeichen und der Laenge einer Zeichenkette
!* Vars: String --- zu untersuchende Zeichenkette (IN)
! NCLead --- Anzahl fuehrender Leerzeichen (OUT)
! NCStr --- Laenge der Zeichenkette ohne fuehrende und
! nachfolgende Leerzeichen (OUT)
! LenStr --- Laenge des uebergebenen Strings (LOC)
! i --- Laufvariable (LOC)
!* Mods: Version 7.11.90/WWB f"ur InfoTech VL
!* Version 7.03.02/TFS f"ur InfoTech VL
!---- --------------------------------------
!* Deklarationen und Initialisierungen
CHARACTER :: String*(*)
INTEGER :: LenStr, NCLead, NCStr
NCLead = 0
NCStr = 0
!* Ausfuehrbarer Teil des Unterprogramms
!---- Uebergegebene Laenge ermitteln
LenStr = LEN (String)
!---- Fuehrende Leerstellen ermitteln
i = 1
DO WHILE ((i<=LenStr) .AND. (String (i:i) /= ' '))
NCLead = i
i = i + 1
ENDDO
!---- Echte Stringlaenge ermitteln durch Absuchen des Strings
!---- nach Leerstellen vom Ende her
NCStr = LenStr - NCLead
i = LenStr
DO WHILE (i <= NCLead +1 .AND. (String (i:i) .NE. ' '))
NCStr = i - NCLead - 1
i = i - 1
ENDDO
!-------------------------------------------
END SUBROUTINE
- DO-Schleifen sind
geschachtelt, wenn sich im
Wiederholungsbereich einer
Schleife eine weitere DO-Schleife befindet.
Sprünge sind nur von der inneren
in die äußere erlaubt. Einzige
Ausnahme ist ein Sprung aus der
äußeren an den Beginn der
inneren Schleife. Jedoch sollten Sprünge vollkommen vermieden werden!!
- Direkt über
Parameterliste
Direkt und indirekt über
COMMON-Blöcke
Indirekt über externe Dateien
- Die FUNCTION gibt
ihr Ergebnis über den Function-Namen
zurück, die SUBROUTINE über die
Parameterliste.
- -
- Man schreibt die Anzahl der
records (Zeilen) an den
Anfang der Datei.
- -
- Man vereinbart ein spezielles
Dateiendezeichen.
- -
- Man benutzt den END-Parameter
der READ-Anweisung.
- In
Standard-FORTRAN gibt es diese
Möglichkeit nicht.
Falls es mit einem bestimmten Compiler
möglich ist, handelt es sich um eine
nichtstandardisierte Spracherweiterung.
Das FORTRAN-Programm könnte so
aussehen:
i = 0
j = 0
k = 0
DO
IF (j
k) THEN
k = k + 2
ELSE
k = k + 1
j = j + k
ENDIF
IF (j
10) EXIT
ENDDO
DO i = 1, 10
j = j + i
ENDDO
PRINT*, i, j, k
END
- 3 5 4 6
- 12345678901234567890
1010
10
- Das
FORTRAN-Programm könnte so aussehen:
OPEN (1,file='TEST.DAT')
i=0
xm=0.
DO
READ (1,*, IOSTAT=ios) x
IF (ios = 0) THEN
i = i + 1
xm=xm+x
ENDIF
IF (ios /= 0) EXIT
ENDDO
PRINT *,' Der Mittelwert ist ',xm/i
END
Der Mittelwert ist 4.409