Fortran
Ausführungskontrolle
Suche…
Wenn konstruieren
Das if
Konstrukt (in FORTRAN 77 als Block-IF-Anweisung bezeichnet) ist in vielen Programmiersprachen üblich. Es führt bedingt einen Codeblock aus, wenn ein logischer Ausdruck als wahr ausgewertet wird.
[name:] IF (expr) THEN
block
[ELSE IF (expr) THEN [name]
block]
[ELSE [name]
block]
END IF [name]
woher,
- name - der Name des if-Konstrukts (optional)
- expr - ein skalarer logischer Ausdruck in Klammern
- Block - eine Folge von null oder mehr Anweisungen oder Konstrukten
Ein Konstruktname am Anfang einer if then
Anweisung muss den gleichen Wert wie der Konstruktname am end if
Anweisung haben und sollte für die aktuelle Bereichseinheit eindeutig sein.
In if
Anweisungen können (in) Gleichungen und logische Ausdrücke, die eine Anweisung auswerten, mit den folgenden Operatoren verwendet werden:
.LT. which is < ! less than
.LE. <= ! less than or equal
.GT. > ! greater than
.GE. >= ! greater than or equal
.EQ. = ! equal
.NE. /= ! not equal
.AND. ! logical and
.OR. ! logical or
.NOT. ! negation
Beispiele:
! simplest form of if construct
if (a > b) then
c = b / 2
end if
!equivalent example with alternate syntax
if(a.gt.b)then
c=b/2
endif
! named if construct
circle: if (r >= 0) then
l = 2 * pi * r
end if circle
! complex example with nested if construct
block: if (a < e) then
if (abs(c - e) <= d) then
a = a * c
else
a = a * d
end if
else
a = a * e
end if block
Eine historische Verwendung des if
Konstrukts liegt in einer sogenannten "arithmetic if" -Anweisung. Da dies durch modernere Konstruktionen ersetzt werden kann, wird es hier nicht behandelt. Weitere Details finden Sie hier .
SELECT CASE-Konstrukt
Ein select case
Konstrukt führt bedingt einen Block von Konstrukten oder Anweisungen aus, abhängig vom Wert eines Skalarausdrucks in einer select case
Anweisung. Dieses Kontrollkonstrukt kann als Ersatz für berechnete goto
.
[name:] SELECT CASE (expr)
[CASE (case-value [, case-value] ...) [name]
block]...
[CASE DEFAULT [name]
block]
END SELECT [name]
woher,
- name - der Name des
select case
Konstrukts (optional) - expr - ein skalarer Ausdruck vom Typ Ganzzahl, Logisch oder Zeichen (in Klammern eingeschlossen)
- case-value - Ein oder mehrere Skalarausdrücke für Integer, Logisch oder Zeicheninitialisierung in Klammern
- Block - eine Folge von null oder mehr Anweisungen oder Konstrukten
Beispiele:
! simplest form of select case construct
select case(i)
case(:-1)
s = -1
case(0)
s = 0
case(1:)
s = 1
case default
print "Something strange is happened"
end select
In diesem Beispiel (:-1)
Fallwert ein Wertebereich passt auf alle Werte kleiner als Null ist , (0)
auf Nullen übereinstimmt, und (1:)
Streichhölzer auf alle Werte über Null, default
beinhaltet Abschnitt , wenn andere Abschnitte haben nicht ausgeführt.
DO-Konstrukt blockieren
Ein do
Konstrukt ist ein Schleifenkonstrukt, das eine Anzahl von Iterationen aufweist, die von einer Schleifensteuerung gesteuert werden
integer i
do i=1, 5
print *, i
end do
print *, i
In der obigen Form durchläuft die Schleifenvariable i
die Schleife fünfmal und nimmt wiederum die Werte 1 bis 5 an. Nachdem das Konstrukt abgeschlossen ist, hat die Schleifenvariable den Wert 6, das heißt, die Schleifenvariable wird nach Abschluss der Schleife noch einmal inkrementiert .
Allgemeiner kann das do
Schleifenkonstrukt wie folgt verstanden werden
integer i, first, last, step
do i=first, last, step
end do
Die Schleife beginnt mit i
mit dem Wert first
und erhöht jede Iteration step
bis i
größer als der last
(oder kleiner als der last
wenn die Schrittgröße negativ ist).
Es ist wichtig zu beachten, dass seit Fortran 95 die Schleifenvariable und die Schleifensteuerungsausdrücke ganzzahlig sein müssen.
Eine Iteration kann mit der cycle
Anweisung vorzeitig beendet werden
do i=1, 5
if (i==4) cycle
end do
und das gesamte Konstrukt kann die Ausführung mit der exit
Anweisung beenden
do i=1, 5
if (i==4) exit
end do
print *, i
do
Konstrukte können benannt werden:
do_name: do i=1, 5
end do do_name
was besonders nützlich ist, wenn verschachtelte do
Konstrukte vorhanden sind
do1: do i=1, 5
do j=1,6
if (j==3) cycle ! This cycles the j construct
if (j==4) cycle ! This cycles the j construct
if (i+j==7) cycle do1 ! This cycles the i construct
if (i*j==15) exit do1 ! This exits the i construct
end do
end do1
do
Konstrukte können auch eine unbestimmte Schleifensteuerung aufweisen, entweder "für immer" oder bis eine bestimmte Bedingung erfüllt ist
integer :: i=0
do
i=i+1
if (i==5) exit
end do
oder
integer :: i=0
do while (i<6)
i=i+1
end do
Dies ermöglicht auch eine unendliche do
Schleife über eine .true.
Aussage
print *,'forever'
do while(.true.)
print *,'and ever'
end do
Ein do
Konstrukt kann auch die Reihenfolge der Iterationen unbestimmt lassen
do concurrent (i=1:5)
end do
Beachten Sie, dass die Form der Schleifensteuerung dieselbe ist wie bei einer forall
Steuerung.
Es gibt verschiedene Einschränkungen für die Anweisungen, die innerhalb des Bereichs eines do concurrent
Konstrukts ausgeführt werden können, die sicherstellen sollen, dass keine Datenabhängigkeiten zwischen den Iterationen des Konstrukts bestehen. Diese explizite Angabe durch den Programmierer kann eine stärkere Optimierung (einschließlich Parallelisierung) durch den Compiler ermöglichen, die sonst möglicherweise schwer zu bestimmen ist.
"Private" -Variablen innerhalb einer Interation können durch Verwendung eines block
innerhalb von do concurrent
:
do concurrent (i=1:5, j=2:7)
block
real tempval ! This is independent across iterations
end block
end do
Eine andere Form des Block- do
Konstrukts verwendet eine beschriftete continue
Anweisung anstelle eines end do
:
do 100, i=1, 5
100 continue
Es ist sogar möglich, solche Konstrukte mit einer gemeinsamen Beendigungsanweisung zu verschachteln
do 100, i=1,5
do 100, j=1,5
100 continue
Beide Formen und insbesondere die zweite (die veraltet ist) sind aus Gründen der Übersichtlichkeit generell zu vermeiden.
Schließlich gibt es auch einen nicht-Block do
konstruieren. Dies gilt auch als veraltet und wird an anderer Stelle zusammen mit Methoden zum Umstrukturieren als Block- do
Konstrukt beschrieben.
WO konstruieren
Das where
Konstrukt, das ab Fortran90 verfügbar ist, repräsentiert ein maskiertes do
Konstrukt. Die Maskierungsanweisung folgt den gleichen Regeln der if
Anweisung, wird jedoch auf alle Elemente des angegebenen Arrays angewendet. Durch die Verwendung von where
können Operationen an einem Array (oder mehreren Arrays derselben Größe) ausgeführt werden, deren Elemente eine bestimmte Regel erfüllen. Dies kann verwendet werden, um gleichzeitige Operationen mit mehreren Variablen zu vereinfachen.
Syntax:
[name]: where (mask)
block
[elsewhere (mask)
block]
[elsewhere
block]
end where [name]
Hier,
- name - ist der Name, der dem Block gegeben wurde (falls benannt)
- Maske - ist ein logischer Ausdruck, der auf alle Elemente angewendet wird
- Block - Reihe von Befehlen, die ausgeführt werden sollen
Beispiele:
! Example variables
real:: A(5),B(5),C(5)
A = 0.0
B = 1.0
C = [0.0, 4.0, 5.0, 10.0, 0.0]
! Simple where construct use
where (C/=0)
A=B/C
elsewhere
A=0.0
end
! Named where construct
Block: where (C/=0)
A=B/C
elsewhere
A=0.0
end where Block