Name
IF_THEN_ELSE_ENDIF

Syntax
IF bedingung THEN befehl
oder
IF bedingung THEN befehl1  ELSE befehl2
oder
IF bedingung THEN
  befehl1 : befehl2 [...]
  befehln
  
ENDIF
oder
IF bedingung THEN
  befehl1 : befehl2 [...]
  befehln
  
ELSE
  befehln+1 : befehln+2 [...]
  befehln+m
  
ENDIF

Aufklappen Wertebereiche
bedingung numerischer Ausdruck, Typ binär (*)
befehli beliebiger GDL-Befehl

(*) tatsächlich geht es um die Prüfung einer Bedingung, die als Ergebnis FALSCH (=0) oder WAHR (≠0) liefert.

Aufklappen Erläuterung
Diese Befehlskonstruktion führt die in ihr enthaltenen Befehle nur bedingt aus.

Nach dem IF wird eine bedingung formuliert, nach der entschieden wird, ob oder welche Befehle ausgeführt werden. GDL ist da recht tolerant und interpretiert nicht nur 1 als logisch WAHR sondern jeden Wert ungleich 0.
Trifft die bedingung zu, ist also logisch WAHR, wird der Befehl nach THEN abgearbeitet, wenn nicht, wird er übersprungen und nicht ausgeführt.
Folgt dem bedingten Befehl unmittelbar ein ELSE wird der nun folgende Befehl nur abgearbeitet, wenn die bedingung logisch FALSCH ist, also nicht zutrifft. Ist die bedingung WAHR, wird dieser Befehl übersprungen. Die Verwendung von ELSE ist optional, kann also auch entfallen, wenn dies nicht notwendig ist.

Die Verwendung von ENDIF wird dann notwendig, wenn mehr als ein Befehl von der Bedingung abhängig sein sollen. Dann sind die Befehle nicht mehr in der gleichen Programmzeile wie IF...THEN zu schreiben, sondern in einer neuen. Das gleiche gilt für die Befehle nach ELSE. Mit und ohne Verwendung von ELSE muss dann das IF...THEN-Konstrukt mit ENDIF abgeschlossen werden. (Ist nach ELSE nur ein Befehl bedingt auszuführen und schreibt man diesen in der gleichen Zeile nach ELSE, ist ENDIF nicht nötig. Siehe auch "Besonderheiten".)

Bedingte Programmablaufverzweigungen mit GOTO und GOSUB sind zulässig.

Es können mehrere IF...THEN-Konstrukte ineinander verschachtelt werden. Dann ist aber zumindest für alle äußeren IF...THEN-Bedingungen die mehrzeilige Syntax unter Verwendung von ENDIF zwingend nötig.

Aufklappen Beispiel
Beispiel 1a:
IF wert>5 THEN LINE2 0,0,1,0
IF wert<=5 THEN LINE2 0,1,0,1


Beispiel 1b:
IF wert>5 THEN
 LINE2 0,0,1,0
 ENDIF
IF wert<=5 THEN
 LINE2 0,1,0,1
 ENDIF


Beispiel 1c:
IF wert>5 THEN LINE2 0,0,1,0 ELSE LINE2 0,1,0,1

Beispiel 1d:
IF wert>5 THEN
 LINE2 0,0,1,0
 ELSE
 LINE2 0,1,0,1
 ENDIF


Beispiel 2:
IF NOT(wert=5) THEN LINE2 0,1,0,1
Umkehrung der Bedingungsentscheidung mit NOT().

Beispiel 3:
IF wert>5 THEN
 LINE2 0,0,1,0
 LINE2 0,1,1,1
 ELSE
 IF wert<=5 THEN
  LINE2 0,0,0,1 : LINE2 1,0,1,1
  ENDIF
 IF wert=5 THEN LINE2 0,0,1,1
 ENDIF


Aufklappen Besonderheiten
Die Syntax lässt noch 2 Sonderfälle zu. Bei bedingten Verzweigungen im Programmablauf ist auch eine Kurzschreibweise zulässig:

So ist statt der Befehlszeile
IF bedingung THEN GOTO sprungziel
auch erlaubt
IF bedingung GOTO sprungziel
zu verwenden.

Ebenso gilt für den Aufruf von Unterprogrammen:
IF bedingung THEN GOSUB sprungziel
ist gleichbedeutend mit
IF bedingung GOSUB sprungziel

Siehe dazu auch GOTO und GOSUB. V.a. die Hinweise zur Verwendung der Sprungziele.

Mit ArchiCAD® 9 wurde die interne, automatische Verwendung von Integer-Variablen eingeführt. Das führt dazu, dass einige Bedingungen, die Variablen vom Typ real enthalten und die unter ArchiCAD® 8.1 und früher korrekte Entscheidungen liefern nun wegen Rundungsungenauigkeiten andere Ergebniss liefern können. So ist die Bedingung 5=5.0000001 eben FALSCH und nicht wie wahrscheinlicht beabsichtigt WAHR. Folgendes Beispiel erläutert die neue Vorgehensweise um diese "Fehler" sicher zu vermeiden:

! wert1 und wert2 sind numerische Variablen
! Schwellenwert für Rundungsfehler 1/100mm:
schwelle=0.00001
IF ABS(wert1-wert2) < schwelle THEN PRINT "identisch!"


Siehe dazu auch numerische Ausdrücke und den dortigen Links,

Aufklappen Tipps und Tricks
Im GDL-Handbuch ist die Konstruktion
IF bedingung THEN
  befehl1 : befehl2 [...]
  befehln
  ELSE befehln+1

als zulässig angeführt. Ein ENDIF ist also nicht nötig, wenn nach dem ELSE nur 1 Befehl und dieser direkt danach in der gleichen Zeile folgt. Wir raten dennoch davon ab auf ENDIF zu verzichten, da wir darin eine Fehleranfälligkeit sehen und die Übersichtlichkeit leidet.

Von Befehlszeilen wie
IF entscheidung THEN : a=2 : b=3 : ELSE : a=4 : b=5 : ENDIF
ist prinzipiell abzuraten, da in einigen ArichCAD Versionen damit andere als die erwarteten Befehle abgearbeitet werden oder es zu unerklärlichen "Fehlende ENDIF-Anweisung"-Fehlern kommt.

Doppelpunkte am Ende einer Befehlszeile sind (abgesehen von Sprungmarken) überflüssig und können diese Fehler verursachen. Siehe Link zu GDL-Talk.

Bei der Verwendung mehrerer bedingter Befehle sollten die Elemente des IF...THEN...ENDIF-Konstruktes in separaten Zeilen stehen und mit einem ENDIF abgeschlossen werden.