.PL72
.MT1
.MB3
.FM1
.FO
.HE TURBO-Pascal Seite #
.PN13
.PO8
2. Grundlegende Sprachelemente
2.1 Grundsymbole
Das Grundvokabular von TURBO-Pascal besteht aus Grundsymbolen,
die zu folgenden Klassen zusammengefasst sind:
<Buchstaben> ::= A|B|C|D|E|F|G|H|I|J|K|L|M|
N|O|P|Q|R|S|T|U|V|W|X|Y|Z|
a|b|c|d|e|f|g|h|i|j|k|l|m|
n|o|p|q|r|s|t|u|v|w|x|y|z|_
<Ziffern> ::= 0|1|2|3|4|5|6|7|8|9
<Sonderzeichen> ::= +|-|*|/|=|^|<|>|(|)|[|]|{|}|
.|,|:|;|'|@|$
Es gibt weiterhin einige Operatoren, die aus zwei Symbolen bestehen:
Zuweisungsoperator: :=
Vergleichsoperatoren: <> <= >=
Teilbereichsbegrenzer: ..
Klammern: (. .) gleichbedeutend mit [ ]
Kommentar: (* *) gleichbedeutend mit { }
2.2 Reservierte Worte
Folgende Worte sind in TURBO-Pascal fest definiert und duerfen
nur fuer die entsprechenden Zwecke verwendet werden. Mit Stern
versehene Worte sind nicht in Standard-Pascal enthalten:
*absolute and array begin case const
div do downto else end *external
file *forward function goto if in
*inline label mod nil not of
or packed procedure programm record repeat
set *shl *shr *string then to
type until var while with *xor
2.3 Begrenzer
Sprachelemente muessen durch wenigstens einen der folgenden
Begrenzer getrennt werden:
<space>,
Zeilenende,
Kommentar
2.4 Programmzeilen
Die maximale Laenge einer Programmzeile betraegt 127 Zeichen.
Alle weiteren Zeichen werden ignoriert.
.pa
2.5 Standardbezeichner
TURBO-Pascal verwendet eine Anzahl von Standardbezeichnern als
Namen fuer Konstante, Typen, Variable, Prozeduren und Funktionen.
Jeder dieser Bezeichner kann umdefiniert werden. Man sollte dies
jedoch grundsaetzlich nicht tun, um von vornherein Missverstaend-
nisse und Probleme beim Austausch von Programmen zuvermeiden. Es
wird deshalb die Umdefinition von Standardbezeichnern nicht er-
laubt. Als Standardbezeichner werden verwendet:
Abs ArcTan Assign Aux AuxInPtr AuxOutPtr
Bdos BdosHL BlockRead BlockWriteBios BiosHL
Boolean Buflen Byte Chain Char Chr
Close ClrEOL ClrScr Con ConInPtr ConOutPtr
Concat ConstPtr Copy Cos CrtExit CrtInit
DelLine Deley Delete Dispose EOF EOLN
Erase Execute Exp False FilePos FileSize
FillChar Flush Frac GetMem GotoXY HeapPtr
Hi HighVideo IOresult Input Insline Insert
Int Integer Kbd KeyPressedLength Ln
Lo Lst LstOutPtr Mark MaxInt Mem
MemAvail Move New NormVideo Odd Ord
Output Overlay Pi Port Pos Pred
Ptr Random Randomize Read Readln Real
RecurPtr Release Rename Reset Rewrite Round
Seek Sin SizeOf Sqr Sqrt StackPtr
Str Succ Swap Text Truc True
Trunc UpCase Usr UsrInPtr UsrOutPrt Val
Write Writeln
.pa
3.Standard-Scalartypen
Eine Datentyp-Definition legt die Menge der Werte fest, die
Variable des entsprechenden Typs annehmen koennen und ordnet dem
Typ einen Bezeichner zu.
Jede Variable im Programm muss einem und nur einem Datentyp
zugeordent sein. Obwohl Datentypen in TURBO-Pascal gaenzlich
veraendert werden koennen, werden sie alle aus einfachen
(unstrukturierten) Typen aufgebaut.
Ein einfacher Typ kann entweder vom Programierer definiert werden
(er heisst dann definierter Scalartyp) oder er ist ein Standard-
Scalartyp: Integer, Real, Boolean, Char oder Byte.
3.1 Integer
Integer sind ganze Zahlen. In TURBO-Pascal ist ihr Wertebereich
von -32768 bis 32767
Im Speicher benoetigen sie 2 Bytes. Ex ist zu beachten:
-Ueberlauf von Integerzahlen wird nicht angezeigt.
-Zwischenergebnisse muessen sich innerhalb des Wertebereiches
halten, sonst ergeben sich falsche Werte. So ist beispiels-
weise 1000*100/50 nicht 2000 sondern -621 !
3.2 Byte
Im Speicher benoetigt dieser Typ genau 1 Byte. Er ist ein Teilbe-
reich vom Typ Integer mit einem Wertebereich von:
0 bis 255.
Bytes sind deshalb mit Integervariablen kompatibel und koennen
statt dessen definiert werden. In Ausdruecken koennen sie ge-
mischt auftreten und Integervariablen koennen auch Bytes zugewie-
sen werden.
3.3 Real
Der absolute Wertebereich reicht fuer Realzahlen von
1E-38 bis 1E+38
(dabei bedeutet E: "mal 10 hoch") mit einer Mantisse von 11
signifikanten Zeichen. Der Typ benoetigt im Speicher 6 Bytes.
Bei Ueberlauf haelt das Programm an und meldet einen Ausfueh-
rungsfehler. Ein Unterlauf ergibt den Wert Null.
Obgleich Realzahlen ein Standardtyp sind, sollte man folgende
Unterschiede zu den anderen Standardtypen beachten:
1) Sie duerfen in den Funktionen Pred und Suc nicht als Argu-
mente auftreten.
2) Sie duerfen nicht als Indexzahlen in Bereichen verwendet
werden.
3) Sie duerfen nicht den Grundtyp einer Menge definieren.
4) Sie duerfen nicht zur Steuerung von If und Case verwendet
werden.
5) Von ihnen duerfen keine Teilbereiche definiert werden.
3.4 Boolean
Eine Boolesche Variable kann entweder den Wert wahr oder falsch
haben: (True | False). Es ist festgelegt, dass False<True ist.
Der Type benoetigt im Speicher 1 Byte.
3.5 Char
Die Werte dieses Typs sind die in 2.1 definierte Zeichenmenge
(ASCII-Zeichen). Die Menge ist entsprechend ihrem ASCII-Wert
geordnet. Den normalen ASCII-Zeichen sind Zahlenwerte von 0-255
zugeordnet. Der Typ benoetigt im Speicher 1 Byte.
4. Nutzerdefinierte Sprachelemente
4.1 Bezeichner
Bezeichner werden zur Bezeichnung von Marken, Konstanten, Typen,
Variablen, Prozeduren und Funktionen verwendet.
<Bezeichner> ::= <Buchstabe>{<Buchstabe>|<Ziffer>}
Ein Bezeichner besteht also aus einem Buchstaben, dem Buchstaben
und Ziffern folgen koennen. Die Laenge ist maximal 127 Zeichen
und alle Zeichen sind signifikant.
Beispiel:
TORBO
square
person_counted
BirthDate
3teWurzel falsch! Ziffer am Anfang.
zwei Worte falsch! Leerzeichen unerlaubt.
Bei TURBO-Pascal gibt es zwischen grossen und kleinen Buchstaben
keinen Unterschied. So sind
SehrlangeDefinition = SEHRLANGEDEFINITION
identisch, aber der linke Bezeichner duerfte wohl klar leichter
zu lesen sein.
4.2 Zahlen
Zahlen sind Konstante der Typen Integer und Real. Integerzahlen
sind ganze Zahlen, die dezimal und hexadezimal dargestellt werden
koennen. Hexadezimale Integerzahlen werden durch vorangestellte
$-Zeichen erklaert.
Dezimalzahlen haben einen Bereich von -32768 .. +32767.
Hexadezimalzahlen haben einen Bereich von $0000 .. $FFFF.
Unmittelbar vor einer Dezimalzahl darf ein Vorzeichen stehen.
Beispiele:
1
12345
-345
$ABC
$123
$12c
$12G Falsch! G keine Hexadezimalzahl.
$12.3 Falsch! Punkt keine Hexadezimalzahl.
Der Bereich der Realzahlen betraegt 1E-38 .. 1E+38 mit 11 signi-
fikannten Ziffern. Die Exponentialdarstellung kann verwendet
werden mit E als "mal 10 hoch". Eine Integerkonstante gilt
ueberall dort, wo eine Realzahl gueltig ist. Trennzeichen duerfen
nicht innerhalb von Zahlen stehen. Unmittelbar vor einer Zahl
darf ein Vorzeichen stehen.
Beispiele:
1.0
1234.5678
-0.024
1E6
2E-7
-1.2345678901E+12
1 erlaubt, ist aber eine Integerkonstante.
.pa
4.3 Zeichenkette
Eine Zeichenkettenkonstante ist eine Folge von Zeichen, die in
Hochkomma eingeschlossen sind:
'Dies ist eine Zeichenketten '
In einer Zeichenkette kann auch ein Hochkomma enthalten sein, nur
muss man es dann an der betreffenden Stelle zweimal angeben.
Zeichenketten, die nur aus einem Zeichen bestehen sind vom Typ
Char. Eine Zeichenkette ist kompatibel mit einem Bereich von Char
mit gleicher Laenge. Alle Zeichenkettenkonstanten sind mit allen
Zeichenkettentypen kompatibel.
Beispiele:
'TURBO'
'Du wirst''s sehen!'
''''
'.'
'' leere Zeichenkette.
4.3.1 CXTRL-Steuerzeichen
TURBO-Pascal erlaubt die Verwendung von CTRL-Steuerzeichen als
Zeichenketten. Dabei gibt es zwei Moeglichkeiten der Darstellung:
1) als #-Symbol gefolgt von einer dezimal oder hexadezimal
Zahl. Damit wird ein Zeichen mit dem entsprechenden ASCII-
Wert definiert.
2) als ^-Symbol gefolgt von einem ASCII-Zeichen. Damit wird das
entsprechende CTRL-Zeichen definiert.
Beispiele:
#10 entspricht CTRL-J oder LINE FEED
#$1B entspricht CTRL-[ oder ESCAPE
^G entspricht CTRL-G oder BELL
Folgen von Steuerzeichen koennen ohne Begrenzer aneinandergehaengt
werden:
Beispiele:
#13#10
#27^U#20
^G^G^G^G
Steuerzeichen koennen auch mit anderen Zeichenketten gemischt
auftreten:
Beispiele:
'Wach auf!'^G^G^G'Bitte, wach auf! '
4.4 Kommentare
Kommentare koennen ueberall im Programm stehen, wo Begrenzer
stehen koennen. Sie werden durch geschweifte Klammern { } oder
durch (* *) begrenzt.
Beispiele:
{Das ist ein Kommentar}
(* das ist das gleiche *)
Es koennen in Kommentaren nicht Kommentare mit den gleichen
Begrenzern eingeschlossen werden. Aber es ist erlaubt in Kommen-
taren mit { } Kommentare mit (* *) einzuschliessen und umgekehrt.
Damit kann man Quelltexte, die Kommentare enthalten in Kommentar-
klammern einschliessen und damit im Quelltext bei der Ueberset-
zung verschwinden lassen.
.pa
4.5 Compiler-Direktiven
Einige der Optionen des Compilers werden durch Direktiven
gesteuert. Sie werden in den Quelltext als Kommentare mit einer
speziellen Syntax eingefuegt. Sie koennen ueberall dort im Text
stehen, wo Kommentare stehen koennen.
Eine Compiler-Direktive besteht aus einer oeffnenden Kommentar-
Klammer der unmittelbar ein $-Zeichen und eine Compiler-Direktive
oder eine Liste derartiger Direktiven folgt, die durch Komma
untereinander getrennt sind. Die Syntax der Direktiv-Zeichen
selbst haengt von der speziellen Direktive ab, die im Anhang E
beschrieben sind.
Beispiele:
{$I-}
{$I E:INCLUDE.FIL}
{$R-,B+,V-}
.pa
5. Programmkopf und Programmblock
Ein Pascal-Programm besteht aus dem
- Programmkopf, dem der
- Programmblock folgt.
Der Programmblock selbst besteht aus dem
- Deklarationsteil und dem
- Anweisungsteil.
Im Deklarationsteil werden alle lokalen Objekte des Programmes
definiert und im Anweisungteil stehen alle Aktionen, die mit
diesen Objekten ausgefuehrt werden sollen.
5.1 Programmkopf
In TURBO-Pascal ist der Programmkopf voellig unverbindlich und
hat fuer das Programm keinerlei Bedeutung. Wenn er angegeben
wird, und dies ist sehr zu empfehlen, sollte er ausser dem reser-
vierten Namen Program den Programmnamen und in der Parameterliste
die speziell verwendeten Ein- und Ausgabegeraete enthalten. Die
Liste Parameter besteht aus einer Folge von Bezeichnern, die
durch Komma getrennt und in runde Klammern eingeschlossen sind.
Beipiele:
Program Circles;
Program Rechnung(Input,Output)
Program Druck(Input,Drucker)
5.2 Deklarationsteil
Der Deklarationsteil eines Blockes definiert alle Bezeichner, die
im Anweisungsteil des Blockes und in dem in ihm moeglicherweise
enthaltenen Bloecken verwendet werden. Er besteht aus fuenf Tei-
len:
1) Markenvereinbarungsteil
2) Konstantendefinitionsteil
3) Typdefinitionsteil
4) Variablenvereinbarungsteil
5) Prozedur- und Funktionsvereinbarungsteil
Waehrend Standard-Pascal festlegt, dass jeder dieser Teile nur
Null oder einmal und nur in der oben angegeben Ordnung auftreten
darf, erlaubt TURBO-Pascal, dass obige fuenf Teile mehrmals in
beliebiger Ordnung im Deklarationsteil auftreten duerfen.
5.2.1 Markenvereinbarungsteil
Jede Anweisung ein einem Programm kann durch eine Marke
gekennzeichnet werden. Dadurch wird es moeglich mittels eine
GOTO-Anweisung direkt zu dieser Anweisung zu verzweigen.
Eine Marke besteht aus einem Markennamen, gefolgt von einem
Doppelpunkt. Bevor eine Marke verwendet werden darf, muss sie im
Markenvereinbarungsteil definiert sein. Die Definition beginn mit
dem reservierten Wort Label, dem eine Liste von Markennamen, die
alle durch Kommas voneinander getrennt sind, folgt und die durch
ein Semikolon abgeschlossen wird.
Beispiel:
Label 10,error,999,Quit;
Waehrend Standard-Pascal nur maximal vierstellige ganze Zahlen
als Markannamen zulaesst, erlaubt TURBO-Pascal sowohl die
Verwendung von Ziffern als auch von Bezeichnern.
.pa
5.2.2 Konstantendefinitionsteil
Der Konstantendefinitionsteil enthaelt die Definitionen aller
Synomyme fuer Konstanten, die in einem Block auftreten. Die
Definition beginnt mit dem reservierten Wort const, dem eine
Liste von Konstantenzuweisungen folgt, die durch Semikolon von-
einander getrennt sind. Jede Konstantenzuweisung besteht aus
einem Bezeichner , dem ein Gleichheitszeichen und eine Konstante
folgt.
Beispiel:
const
Limit = 255;
Max = 1024;
PassWord = 'SESAM';
CursHome = ^['V';
In TURBO-Pascal gibt es folgende fest definierten Konstante, die
ohne vorherige Definition verwendet werden koennen:
Name Typ Wert
Pi Real -3.1415926536E+00
False Boolean Wahrheitswert: falsch
True Boolean Wahrheitswert: richtig
Maxint Integer 32767
Im Konstantendefinitionsteil koennen auch typ-definierte Konstan-
ten vereinbart werden (siehe 13).
5.2.3 Typdefinitionsteil
Ein Datentyp kann in Pascal entweder direkt im Variablendefini-
tionsteil oder durch einen Typbezeichner beschrieben werden. Es
gibt bestimmte festgelegte Typbezeichner, aber der Nutzer kann
durch Verwendung der Typdefinition diese Liste beliebig erwei-
tern.
Die Typdefinition beginnt mit dem reservierten Wort type, dem
eine oder mehrere Zuweisungen folgen, die durch Semikolon vonein-
ander getrennt werden. Jede Zuweisung besteht aus einem Typ-
Bezeichner, dem ein Gleichheitszeichen und ein Typ folgt.
Beispiele:
type
Number = Integer;
Tag = (Montag,Dienstag,Mittwoch,Donnerstag,
Freitag,Sonnabend,Sonntag);
List = array[1..10] of Real;
.pa
5.2.4 Variablenvereinbarungsteil
Jede in einem Programm auftretende Variable muss vorher definiert
werden. Die Definition muss im Text vor der ersten Verwendung der
Variablen auftreten, d.h. die Variable muss dem Compiler bekannt
sein, bevor sie verwendet wird.
Eine Variablenvereinbarung beginnt mit dem reservierten Wort Var,
dem ein oder mehrere Bezeichner folgen, die durch Kommas vonein-
ander getrennt sind. Dieser Liste folgt ein Doppelpunkt und ein
Typ. Damit werden von dem spezifizierten Typ neue Variable aufge-
baut, denen als Namen die spezifizierten Bezeichner zugewiesen
sind. Der Gueltigkeitsbereich der Bezeichner ist der Block, in
dem sie definiert wurden. Zu diesem Gueltigkeitsbereich gehoeren
auch alle Bloecke, die in dem genannten Block enthalten sind. Man
beachte jedoch, dass in jedem solchen Block, der in einem anderen
enthalten ist, andere Variable definiert werden koennen, die die
gleichen Bezeichner verwenden. Diese Variable heissen dann lokal
zu diesem Block und zu anderen Bloecken, die in ihm enthalten
sind. Variable, die ausserhalb eines Blockes definiert wurden,
heissen globale Variable und sind, wenn lokale Variable mit
gleichem Bezeichner auftreten in diesem Block dann nicht mehr
zugaenglich.
Beispiel:
Var
Result,Intermediate,SubTotal:Real;
I,J,X,Y:Integer;
Accepted,Valid:Boolean;
Period:Tag
Buffer:array[0..127] of Byte
5.2.5 Prozedur- und Funktionsvereinbarungsteil
Eine Prozedurvereinbarung dient der Definition einer Prozedur
innerhalb einer anderen Prozedur oder eines Programmes (siehe
16.2). Eine Prozedur wird durch eine Prozeduranweisung aktiviert
(siehe 7.1.2) und nach der Ausfuehrung dieser Prozeduranweisung
wird das Programm mit der Anweisung fortgesetzt, die unmittelbar
der Call-Anweisung der Prozedur folgt.
Eine Funktionsvereinbarung dient zur Defintion eines Programm-
teiles, das eine Variable berechnet und zurueckgibt (siehe 16.3).
Eine Funktion wird aktiviert, wenn sein Bezeichner als Teil eines
Ausdruckes auftritt (siehe 6.2).
5.3 Anweisungsteil
Der Anweisungsteil ist der letzte Teil eines Blockes. Er spezifi-
ziert die Aktionen, die durch das Programm ausgefuehrt werden.
Der Anweisungsteil besteht aus einer Verbundanweisung, der ein
Punkt '.' folgt. Eine Verbundanweisung besteht aus dem reservier-
ten Wort begin, dem eine Liste von einzelnen Anweisungen folgt.
Diese sind in der Liste durch Semikolon voneinander getrennt und
werden durch das reservierte Wort end abgeschlossen.
.pa
6. Ausdruecke
Ausdruecke sind Konstruktionen, die Regeln fuer das Rechnen mit
den vorliegenden Werten von Variablen und die Erzeugung neuer
Werte durch Anwendung von Operatoren zum Inhalt haben. Sie beste-
hen aus Operanden, d.h. Variablen, Konstanten und Funktionsbe-
zeichnungen, die mittels der unten definierten Operatoren kombi-
niert werden. Dieser Abschnitt beschreibt, wie Ausdruecke aus
Standard-Skalartypen Integer, Real, Boolean und Char gebildet
werden. Ausdruecke, die definierte Skalartypen, Stringtypen und
Mengentypen enthalten, werden in 8.1, 9.2 und 12.2 respektive
definiert.
6.1 Operatoren
Operatoren koennen entsprechend ihrer Rangfolge in fuenf Katego-
rien eingeteilt werden:
1) Minusvorzeichen (Minus mit einem Operanden).
2) Not Operator.
3) Multiplikationsoperatoren: *,/,div,mod,and,shl,shr.
4) Additionsoperatoren: +,-,or,xor.
5) Vergleichsoperatoren: =,<>,<,>,<=,>=,in.
Folgen von Operatoren gleichen Ranges werden von links nach
rechts abgearbeitet.
Ausdruecke in Klammern werden zuerst abgearbeitet, unabhaengig
von den davor oder dahinter stehenden Operatoren. Sind beide
Operanden eines Multiplikations- oder Additionsoperators vom Typ
Integer, dann ist auch das Ergebnis vom Integertyp. Wenn einer
oder beide Operanden vom Typ Real sind, dann ist auch das Ergeb-
nis vom Realtyp.
6.1.1 Minuszeichen
Das Minuszeichen bezeichnet die Negation des Operanden, der vom
Typ Integer oder Real sein muss.
6.1.2 NOT-Operator
Der NOT-Operator negiert den logichen Wert eines Booleschen
Operanden:
not True = False
not False = True
TURBO-Pascal erlaubt auch die Anwendung des NOT-Operators auf
Integer-Operanden. In diesem Falle erfolgt die Negation der ein-
zelnen Bits.
Beispiele:
not 0 = -1
not -15 = 14
not $2345 = $DCBA
.pa
6.1.3 Multiplikationsoperanden
Operator Operation Operandentypen Ergebnistyp
* Multiplikation Real,Real Real
* Multiplikation Integer,Integer Integer
* Multiplikation Integer,Real Real
/ Division Real,Real Real
/ Division Integer,Real Real
/ Disision Integer,Integer Real
div Ganzzahlige Division Integer Integer
mod Modulo Integer Integer
and Arithmetisches and Integer Integer
and Logisches and Boolean Boolean
shl Shift links Integer Integer
shr Shift rechts Integer Integer
Beispiele:
123*456 = 492 falsch, Ueberlauf der Integerzahl!
123/4 = 30.75
123 div 4 = 30
12 mod 5 = 2
true and false = falsch
12 and 22 = 4
2 shl 7 = 256
256 shr 7 = 2
6.1.4 Additionsoperatoren
Operator Operation Operandentypen Ergebnistyp
+ Addition Real,Real Real
+ Addition Real,Integer Real
+ Addition Integer,Integer Integer
- Subtraktion Real,Real Real
- Subtraktion Real,Integer Real
- Subtraktion Integer,Integer Integer
or Arithmetisches or Integer,Integer Integer
or Logisches or Boolean,Boolean Boolean
xor Arithmetisches xor Integer,Integer Integer
xor Logisches xor Boolean,Boolean Boolean
Beispiele:
123 + 456 = 579
456 - 123.0 = 333.0
true or false = True
12 or 22 = 30
true xor false = True
12 xor 22 = 26
.pa
6.1.5 Vergleichsoperatoren
Vergleichsoperatoren koennen mit allen Standardtypen Real,
Integer, Boolean, Char und Byte verbunden werden. Operanden vom
Typ Integer, Real und Byte koennen gemischt auftreten. Der
Ergebnistyp ist stets Boolean, d.h. True oder False.
Es bedeuten:
= gleich <> nicht gleich
< groesser als > kleiner als
<= kleiner oder gleich >= groesser oder gleich
Beispiele:
a = b True,wenn a gleich b
a <> b True,wenn a ungleich b
a > b True,wenn a groesser b
a < b True,wenn a kleiner b
a >= b True,wenn a groesser oder gleich b
a <= b True,wenn a kleiner oder gleich b
6.2 Funktionsaufruf
Ein Funktionsaufruf besteht aus einem Funktionsbezeichner, dem
eine wahlfreie Parameterliste folgt. Diese Liste besteht aus
einer oder mehreren Variablen oder Ausdruecken, die durch Komma
voneinander getrennt und insgesamt in runde Klammern eingeschlos-
sen sind.
Das Auftreten eines Funktionsaufrufes im Programm bewirkt die
Aktivierung der Funktion, die durch sie bezeichnet wird. Wenn die
Funktion keine Standardfunktion ist, muss sie vor der Aktivierung
definiert sein.
Beispiele:
Round(PlotPos)
Writeln(Pi * (Sqr(R)))
(Max(x,y) < 25) and (Z > Sqrt(x*y))
Volumen(Radius,Hoehe)
.pa
7.Anweisungen
Der Anweisungsteil eines Programmes, einer Prozedur oder einer
Funktion definiert die algorithmischen Aktionen als Folge aus-
fuehrbarer Anweisungen. Diese Folge besteht aus Anweisungen, die
durch Semikolon voneinander getrennt sind. Sie beginnt mit dem
reservierten Wort begin und endet mit dem reservierten Wort end.
Anweisungen in Pascal sind entweder einfache oder strukturierte
Anweisungen.
7.1 Einfache Anweisungen
Einfache Anweisungen sind Anweisungen, die keine weiteren Anwei-
sungen enthalten. Es sind dies die
Ergibtanweisung,
Prozeduranweisung,
Sprunganweisung und
Leeranweisung.
7.1.1 Ergibtanweisung
Die Ergibtanweisung ist die fundamentalste aller Anweisungen. Sie
wird verwendet, um einer bestimmten Variablen einen bestimmten
Wert zuzuweisen. Eine Ergibtanweisung besteht aus einem Variab-
lenbezeichner, dem Ergibtoperator := und einem Ausdruck. Eine
Zuweisung ist moeglich zu Variablen von beliebigem Typ (ausser
Files), wenn der Ausdruck vom gleiche Typ ist. Es gibt nur eine
Ausnahme: Ist die Variable vom Realtyp, kann der Ausdruck vom
Integertyp sein.
Beispiele:
Angle := Angle * Pi;
AccessOk := False;
Entry := Answer = Password;
SpherVol := 4 * Pi * R * R;
UpCas := (Ch > 'A') and (Num <= 'Z')
7.1.2 Prozeduranweisung
Eine Prozeduranweisung dient der Aktivierung einer Standardproze-
dur oder einer vorher vom Nutzer definierten Prozedur. Die Anwei-
sung besteht aus dem Prozedurbezeichner, dem wahlweise eine Para-
meterliste folgt. Diese Liste besteht aus Variablen oder Aus-
druecken, die durch Komma voneinander getrennt und in runden
Klammern eingeschlossen sind. Wird die Prozedur bei der Programm-
ausfuehrung erreicht, geht die Steuerung an die Prozedur ueber
und die angegebenen Parameterwerte werden uebergeben. Wenn die
Prozedur ausgefuehrt wurde, wird das Programm mit der Ausfuehrung
der dieser Prozedur folgenden Anweisung fortgesetzt.
Beispiele:
Find(Name,Adresse);
Sort(Adresse);
UpperCase(Text);
UpdateLastFile(LastRecord);
.pa
7.1.3 Sprunganweisung
Eine Sprunganweisung besteht aus dem reservierten Wort goto, dem
ein Markenbezeichner folgt. Sie dient der Fortfuehrung des Pro-
grammes an der Stelle im Programmtext, an der die Marke steht.
Es gelten folgende Einschraenkungen:
1) Jede Marke muss durch eine Markenvereinbarung im Kopf des
Blockes definiert und durch Kennzeichnung einer Anweisung
festgelegt sein.
2) Der Gueltigkeitsbereich einer Marke ist der Block, in dem
die Marke definiert ist. Deshalb ist es nicht moeglich in
oder aus einer Prozedur oder Funktion zu springen.
7.1.4 Leeranweisung
Eine Leeranweisung ist eine Anweisung, die aus keinem Symbol
besteht und die nichts macht. Sie kann entstehen, wenn die
Pascal-Syntax eine Anweisung verlangt, aber keine vom Algorithmus
her benoetigt wird.
Beispiele:
begin end.
while Antwort <> '' do;
repeat until KeyPressed; {Wartet bis Taste gedrueckt wurde}
7.2 Strukturierte Anweisungen
Strukturierte Anweisungen sind aus anderen Anweisungen zusammen-
gesetzte Konstruktionen, die entweder nacheinander auszufuehren
sind (Verbundanweisungen), bedingt auszufuehren sind (Bedingte
Anweisungen) oder zu wiederholen sind (Zyklusanweisungen). Die
Besprechung der WITH-Anweisung erfolgt in 11.2.
7.2.1 Verbundanweisung
Eine Verbundanweisung wird verwendet, wenn mehr als eine Anwei-
sung an einer Stelle auszufuehren sind, an der die Pascal-Syntax
die Spezifikation von nur einer Anweisung erlaubt. Sie besteht
aus einer beliebigen Anzahl von Anweisungen, die durch Semikolon
voneinander getrennt und in die reservierten Worte begin und end
eingeschlossen werden. Die einzelnen Anweisungen in der Verbund-
anweisung werden nacheinander in der Reihenfolge ausgefuehrt, in
der sie aufgeschrieben wurden.
Beispiel:
if Small > Big than
begin
Tmp := Small;
Small := Big;
Big := Tmp;
end;
.pa
7.2.2 Bedingte Anweisungen
Eine bedingte Anweisung waehlt eine einzelne ihrer Komponentenan-
weisungen zur Ausfuehrung aus.
7.2.2.1 IF-Anweisung
Die IF-Anweisung waehlt die nach dem reservierten Wort then
stehende Anweisung nur dann zur Ausfuehrung aus, wenn eine be-
stimmte Bedingung (Boolescher Ausdruck) wahr ist. Ist sie falsch,
dann wird entweder keine Anweisung oder die Anweisung ausge-
fuehrt, die dem wahlweise stehenden reservierten Wort else folgt.
Da die bedingten IF-Anweisungen geschachtelt werden koennen,
entstehen zweideutige Konstruktionen. Die Konstruktion :
if expr1 then
if expr2 then
stmt1
else
stmt2
wird wie folgt ausgefuehrt:
if expr1 then
begin
if expr2 then
stmt1
else
stmt2
end;
Damit ist klar: Die ELSE-Klausel gehoert stets zur letzten IF-
Anweisung, die keine ELSE-Klausel hat.
Beispiele:
if Interest > 25 then
Usury := True
else
TakeLoan := OK;
if (Entry < 0) or (Entry > 100) then
begin
Write('Bereich ist 1 bis 100, bitte eingeben:';
Read(Entry);
end;
7.2.2.2 CASE-Anweisung
Die CASE-Anweisung besteht aus einem Ausdruck (dem Selektor), der
in die reservierten Worte case und of eingeschlossen ist, und
einer Liste von Anweisungen, von denen jede durch eine Konstante
vom Typ des Selektors markiert ist. Die Liste wird durch das
reservierte Wort end abgeschlossen. Die CASE-Anweisung legt fest,
dass die eine Anweisung auszufuehren ist, deren CASE-Marke gleich
dem vorliegenden Wert des Selektors ist. Enthaelt keine der CASE-
Marken den vorliegenden Wert, dann wird entweder keine Anweisung
ausgefuehrt, oder wahlweise die Anweisung, die dem reservierten
Wort else folgt. Die ELSE-Klausel ist eine Erweiterung gegenueber
Standard-Pascal.
Eine CASE-Marke kann aus einer beliebigen Anzahl von Konstanten
oder Teilbereichen bestehen, die durch Komma getrennt sind und
durch einen Doppelpunkt abgeschlossen werden. Ein Teilbereich
wird dargestellt durch zwei Konstanten, die durch den Teilbe-
reichsbegrenzer '..' getrennt sind. Der Typ der Konstanten muss
der gleiche wie der des Selektors sein. Die Anweisung, die der
CASE-Marke folgt, wird ausgefuehrt, wenn der Wert des Selektors
gleich einer der Konstanten ist oder in einem der Teilbereiche
liegt.
Gueltige Selektortypen sind alle einfachen Typen, d.h. alle Ska-
lartypen ausser Real.
Beispiele:
case Operator of
'+': Result := Input + Result;
'-': Result := Innput * Result;
'/': Result := Input / Result;
end;
case Year of
Min..1939: begin
Time := PreWordWar2;
write('The world at peace...');
end;
1946..Max: begin
Time := PostWorldWar2;
write('Building a new world');
end;
else
Time := WorldWar2;
writeln('We are at war');
end;
7.2.3 Zyklusanweisungen
Zyklusanweisungen legen fest, dass gewisse Anweisungen wiederholt
ausgefuehrt werden sollen. Wenn die Anzahl der Wiederholungen
vorher bekannt ist, d.h. bevor der Zyklus gestartet wird, ist die
FOR-Anweisung die angemessene Konstruktion. Andernfalls sollte
die WHILE-Anweisung oder die REPEAT-Anweisung verwendet werden.
7.2.3.1 WHILE-Anweisung
Die WHILE-Anweisung hat die Form:
while expr do stmt;
Der Ausdruck, der die Wiederholungen steuert, muss vom Typ
Boolean sein. Die Anweisung wird solange ausgefuehrt, wie der
Ausdruck wahr ist. Ist der Ausdruck zu Beginn schon falsch, wird
gar keine Anweisung ausgefuehrt.
7.2.3.2 REPEAT-Anweisung
Die Wiederholanweisung REPEAT hat die Form:
repeat stmt1;stmt2;...;stmtN until expr;
Der die Wiederholung steuernde Ausdruck muss vom Type Boolean
sein. Die Folge der Anweisungen zwischen repeat und until wird
wiederholt (mindestens jedoch einmal) ausgefuehrt, bis der Aus-
druck den Wert True erhaelt.
Beispiele:
repeat
write(^M,'Delete this item? (Y/N)');
read(Answer)
until UpCase(Answer) in ['Y','N'];
7.2.3.3 FOR-Anweisung
Die FOR-Anweisung gibt an, dass eine Anweisung wiederholt ausge-
fuehrt werden soll, waehrend einer Variablen (der Laufvariablen)
eine Folge von Werten zugewiesen wird. Die Folge kann auf- oder
absteigend sein bis zum Endwert. Die Laufvariable, der Anfangs-
wert und der Endwert muessen alle vom gleichen Typ sein. Gueltig
sind alle einfachen Typen, d.h. alle Skalartypen ausser Real.
Die Laufanweisung hat die Form:
for var := Anfwert to Endwert do stmt;
oder
for var := Anfwert downto Endwert do stmt;
Dabei darf die Laufvariable nicht durch die Anweisung geaendert
werden.
Falls Anfangswert > Endwert bei einer TO-Klausel oder Angangswert
< Endwert bei einer DOWNTO-Klausel ist, wird keine Anweisung
ausgefuehrt.
Beispiele:
for i := 2 to 100 do if A[i] > Max then Max := A[i];
for i := 1 to NoOflines do
begin
readln(Line);
if Length(Line)<Limit then ShortLines := ShortLines+1;
else
LongLines := LongLines+1;
end;
Falls die Wiederholung beendet werden soll, bevor der Endwert
erreicht ist, muss eine GOTO-Anweisung benutzt werden. In diesen
Faellen ist es besser eine WHILE- oder REPEAT-Anweisung zu ver-
wenden.
Wenn die FOR-Anweisung verlassen wird, hat die Laufvariable den
Endwert, ausser wenn die Schleife nie durchlaufen wurde. In
diesem Falle wird der Laufvariablen kein Wert zugewiesen.
.pa
8. Skalar- und Teilbereichstypen
Die fundamentalen Datentypen in Pascal sind die Skalartypen. Sie
definieren jeweils eine endliche und lineargeordnete Menge von
Werten. Obgleich der Standardtyp Real zu den Skalartypen gehoert,
stimmt er nicht voellig mit dieser Definition ueberein. Aus
diesem Grunde duerfen auch Realtypen nicht ueberall dort im Text
verwendet werden, wo Skalartypen eingesetzt werden koennen.
8.1 Skalartypen
Abgesehen von den Standard-Skalartypen (Integer, Real, Boolean,
Char und Byte) unterstuetzt TURBO-Pascal vom Nutzer definierte
Skalartypen, sogenannte erklaerte oder definierte Skalartypen.
Die Definition eines solchen Skalartypes gibt die einzelnen moeg-
lichen Werte in geordneter Folge an. Die Werte dieses Types
werden durch die Bezeichner dargestellt, die die Konstanten des
neuen Types sein werden.
Beispiele:
type
Karte = (Karo,Herz,Pik,Kreuz);
Tag = (Mo,Di,Mi,Do,Fr,Sa,So);
Monat = (Jan,Feb,Mrz,Apr,Mai,Jun,Jul,Aug,Sep,Nov,Dez);
Operator = (Plus,Minus,Mult,Div);
Variable vom Typ Karte koennen also die vier Werte: Karo, Herz,
Pik und Kreuz annehmen.
Bereits bekannt ist der Standard-Skalartyp Boolean. Mit diesem
Definitionsverfahren kann man ihn definieren als:
type
Boolean = (False,True)
Die Vergleichsoperatoren =,<,>,<>,>=,<= kann man auf alle Ska-
lartypen anwenden, solange beide Operanden vom gleichen Typ sind
(Real und Integer duerfen gemischt auftreten). Die in der Defini-
tion festgelegte Ordnung wird fuer den Vergleich verwendet, d.h.
links stehende Werte sind kleiner als rechts stehende. Fuer den
Typ Karte gilt also:
Karo < Herz < Pik < Kreuz
Bei folgenden Funktionen duerfen die Argumente Skalartypen sein:
Succ(Pik) Der Nachfolger von Pik ist Kreuz.
Pred(Pik) Der Vorgaenger von Pik ist Herz.
Ord(Pik) Der Ordnungswert von Pik ist 2.
Der Typ des Ergebnisses von Succ und Pred ist der gleiche, wie
der Typ des Argumentes. Das Ergebnis von Ord ist vom Integertyp.
.pa
8.2 Teilbereichstypen
Ein Typ kann als Teilbereich eines bereits definierten Skalar-
types definiert werden und zwar durch Angabe des kleinsten und
des groessten Wertes des Teilbereiches. Die erste Konstante darf
dabei nicht groesser als die zweite sein. Ein Teilbereich vom Typ
Real ist nicht erlaubt.
Beispiele:
type
HemiSphere = (North,South,East,West);
World = (East,West);
CompassRange = 0..360;
Gross = 'A'..'Z';
Klein = 'a'..'z';
Grad = (Celc,Fahr,Ream,Kelv);
Wein = (Rot,Weiss,Rose,Schaum);
Hierbei ist World ein Teilbereich des Skalartyps HemiSphere.
Letzterer heisst der assoziative Skalartyp des ersteren. Der
assoziative Skalartyp von CompassRange ist Integer und der von
Gross und Klein ist Char.
Der bereits genannte Standard-Skalartyp Byte kann mit dieser
Konstruktion definiert werden als:
type
Byte = 0..255
Ein Teilbereichstyp behaelt alle Eigenschaften seines assoziati-
ven Skalartyps und ist nur durch den Bereich seiner Werte be-
schraenkt.
Die Verwendung definierter Skalar- und Teilbereichstypen wird
dringend empfohlen, da sie die Lesbarkeit von Programmen sehr
verbessern. Ausserdem koenne leicht Pruefungen in den Programm-
text eingefuegt werden (siehe 8.4), die waehrend der Ausfuehrung
des Programmes die den Skalar- und Teilbereichsvariablen zugeord-
neten Werte ueberwachen. Ein weiterer Vorteil ist, dass diese
Typen Speicherbereich sparen. TURBO-Pascal ordnet einer Variablen
eines Skalar- oder Teilbereichstyps nur ein Byte zu, falls die
Anzahl der Elemente des Typs kleiner als 256 ist. Analog benoeti-
gen Integer Teilbereichsvariable, deren untere und obere Grenze
innerhalb von 0 bis 255 liegen, ebenfalls nur einen Speicherplatz
von einem Byte.
8.3 Typumwandlung
Die Funktion Ord kann man verwenden, um Skalartypen in Werte vom
Integertyp umzuwandeln. Standard-Pascal enthaelt jedoch keine
Moeglichkeit der Umwandlung in der anderen Richtung, d.h. der
Umwandlung eines Integerwertes in einen anderen Skalarwert.
TURBO-Pascal enthaelt jedoch die Moeglichkeit des "retyping": Man
kann den Wert eines Skalartyps in den Wert eines anderen Skalar-
typs umwandeln, der die gleiche Ordnungszahl besitzt. Diese Um-
wandlung erreicht man, indem man den Typbezeichner des entspre-
chenden Typs als Funktionsbezeichner verwendet und in Klammern
einen Parameter folgen laesst. Als Parameter setzt man den Wert
des anderen Skalartyps ein. Als Wert wird der entsprechende Wert
des ersten Skalartyps zurueckgegeben. Retyping kann man auf alle
Skalartypen ausser Real anwenden.
.pa
Unter Verwendung obiger Definitionsbeispiele gilt dann folgendes:
Integer(Herz) = 2
Monat(10) = Nov
HemiSphere(2) = East
Gross(14) = 'N'
Grad(3) = Kelv
Char(78) = 'N'
Integer('7') = 55
8.4 Bereichspruefung
Das Einfuegen von Bereichspruefungen fuer Skalar- und Teilbe-
reichsvariable in den Programmtext wird durch die Compiler-Direk-
tive {$R+} erzeugt. Der Standardwert fuer diese Direktive ist
{$R-}, d.h. im Normalfall wird keine Bereichspruefung eingebaut.
Wenn diese Direktive aktiv ist, wird bei jeder Zuweisung eines
Wertes zu einer Skalar- oder Teilbereichsvariablen geprueft, ob
dieser Wert auch in dem Bereich der betreffenden Variable liegt.
Es wird empfohlen, diese Pruefungen solange in neuen Programmen
zu belassen, bis sie voellig ausgetestet sind.
Beispiele:
program RangeCheck;
type
Digit = 0..9;
var
Digit1,Digit2,Digit3: Digit;
begin
Dig1 := 5; {gueltig}
Dig2 := Dig1 + 3;{gueltig}
Dig3 := 47 {ungueltig, keine Fehlermeldung}
{$R+} Dig3 := 55 {ungueltig, Fehlermeldung}
{$R-} Dig3 := 167 {ungueltig, keine Fehlermeldung}
.pa
9. Zeichenkettentypen (Strings)
TURBO-Pascal gestattet den Gebrauch von Stringtypen, d.h. die
Verarbeitung von Zeichenketten. Stringtypen sind strukturierte
Typen, die in vielerlei Weise den Feldtypen (siehe 10: array)
aehneln. Es gibt jedoch einen Hauptunterschied zwischen beiden.
Die Anzahl der Zeichen in einer Zeichenkette (ihre Laenge) kann
sehr stark dynamisch zwischen 0 und einer festgelegten oberen
Grenze waehrend der Verarbeitung schwanken, im Gegensatz dazu ist
die Anzahl der Elemente eines Feldes immer fest.
9.1 Stringtyp-Definition
Die Definition eines Stringtyp erfolgt durch Angabe der maximalen
Anzahl der Zeichen, die er enthalten kann, durch seine maximale
Laenge:
type name = string[n];
Die Definition besteht also aus dem reservierten Wort string, dem
die Laenge n in eckigen Klammern folgt. Die Laenge n ist eine
Integerkonstante im Bereich 1 bis 255. Es gibt keine Standard
Laenge, sie muss immer definiert werden.
Beispiele:
type
FileName = string[14];
ScreenLine = string[80];
Eine Stringvariable der Laenge n belegt im Speicher n+1 Byte. Das
zusaetzliche Byte enthaelt die aktuelle Laenge der Variablen. Die
einzelnen Zeichen im String sind indiziert von 1 bis n.
9.2 STRING-Ausdruecke
Zeichenketten koennen durch Bildung von STRING-Ausdruecken mani-
puliert werden. STRING-Ausdruecke bestehen aus STRING-Konstanten,
STRING-Variablen, Funktionsaufrufen und Operatoren.
Das Pluszeichen kann man als STRING-Operator verwenden, um zwei
Zeichenketten miteinander zu verknuepfen. Die CONCAT-Funktion
(siehe 9.5) vermag das gleiche, aber der + Operator wird vorangig
verwendet. Das Ergebnis ist die Verkettung beider Operanden. Ist
die Laenge des Ergebnis-String laenger als 255, entsteht ein
Laufzeitfehler.
Beispiele:
'TURBO-' + 'Pascal' = 'TURBO-Pascal'
'123' + '456' = '123456'
'A' + 'B' + 'C' + 'D ' = 'ABCD '
Die Vergleichsoperatoren haben eine niedrigere Rangfolge, als der
Kettungs-Operator +. Wenn sie auf STRING-Operanden angewendet
werden, ist das Ergebnis ein Boolescher Wert (True oder False).
Werden zwei Strings miteinander verglichen, erfolgt der Vergleich
von links nach rechts. Sind die Strings von unterschiedlicher
Laenge, aber gleich bis einschliesslich zum letzten Zeichen des
kuerzeren Strings, dann ist der kuerzere kleiner. Strings sind
nur dann gleich, wenn sie gleiche Laenge und gleichen Inhalt
haben.
.pa
Beispiele:
'A' < 'B' = richtig
'A' > 'b' = falsch
'2' < '12' = falsch
'TURBO' = 'TURBO' = richtig
'TURBO ' = 'TURBO' = falsch
'Pascal Compiler ' < 'Pascal compiler ' = richtig
9.3 STRING-Ergibtanweisung
Der Ergibtoperator wird verwendet, um das Ergebnis eines STRING-
Ausdruckes einer STRING-Variablen zuzuweisen.
Beispiele:
Alter := 'fuenfzehnten';
Zeile := 'Herzlichen Glueckwunsch zu Deinem ' + Alter +
'Geburtstag';
Wird die maximale Laenge einer STRING-Variablen ueberschritten
(durch Zuweisung zuvieler Zeichen), so werden die restlichen
Zeichen abgeschnitten. Wurde beispielsweise die Variable Alter
mit type Alter = string[5];
definiert, dann ist ihr Wert nach obiger Zuweisung 'fuenf'.
9.4 STRING-Prozeduren
In TURBO-Pascal koennen die folgenden Standard-STRING-Prozeduren
verwendet werden:
9.4.1 DELETE-Prozedur
Syntax: Delete(str,pos,num);
Die Parameter sind:
str STRING Variable,
pos Integer Ausdruck,
num Integer Ausdruck.
Delete erzeugt aus str einen Teilstring durch Loeschen von num
Zeichen beginnend ab Position pos. Wenn pos groesse als die
Laenge von str ist, wird kein Zeichen geloescht. Wenn pos+num
ausserhalb der Zeichenkette liegt, werden nur die Zeichen
geloescht, die ab pos innerhalb liegen. Liegt pos nicht in
1..255, wird ein Laufzeitfehler erzeugt.
Beispiele:
type str = string[10];
str := 'ABCDEFG';
Delete(str,2,4); ergibt 'AFG'.
Delete(str,2,10); ergibt 'A'.
9.4.2 INSERT-Prozedur
Syntax: Insert(obj,target,pos);
Die Parameter sind:
obj STRING Ausdruck,
target STRING Variable,
pos Integer Ausdruck.
Insert fuegt den String obj in den String target ab Position pos
ein. Ist pos groesser als die Laenge von target, wird obj an
target angefuegt. Wenn das Ergebnis laenger als die maximale
Laenge von target ist, werden die ueberstehenden Zeichen
abgeschnitten und target erhaelt nur die links stehenden. Wenn
pos ausserhalb von 1..255 liegt, entsteht ein Laufzeitfehler. Mit
dem oben definierten String str='ABCDEFG' ergeben sich folgende
Beispiele:
Insert('XX',str,3); ergibt 'ABXXEFG'
Insert('UVWXYZ',str,4); ergibt 'ABCUVWX'
9.4.3 STR-Prozedur
Syntax: Str(value,str-var);
Die Paramter sind:
value WRITE-Prozedur-Parameter vom INTEGER/REAL-Typ
str-var STRING-Variable.
Die STR-Prozedur konvertiert den numerischen Wert von value in
eine Zeichenkette und speichert sie in str-var ab.
Beispiele:
Wenn I = 1234
ergibt Str(I:5,str1); in str1 = ' 1234'
Wenn X = 2.5E4
ergibt Str(x:10:0,str2); in str2 = ' 25000'
9.4.4 VAL-Prozedur
Syntax: Val(str,var,code);
Die Parameter sind:
str STRING-Ausdruck,
var INTEGER/REAL-Variable,
Code INTEGER-Variable.
Der STRING-Ausdruck str muss den Regeln einer numerischen Kon-
stanten (siehe 4.2) genuegen. Weder fuehrende noch nachfolgende
Leerzeichen sind erlaubt. Val konvertiert die Konstante zu einem
Wert vom gleichen Typ wie var und speichert diesen Wert in var
ab. Wird kein Fehler festgestellt, ist der Wert der Variablen
code=0. Andernfalls erhaelt code den Wert der Position des ersten
fehlerhaften Zeichens in str und der Wert von var ist undefi-
niert.
Beispiele:
Wenn str1 = '234' ergibt
Val(str1,I,Result); I = 234 Result = 0
Wenn str2 = ' 234' ergibt
Val(str2,I,Result); I = undef. Result = 1
Wenn str3 = '2.5E4' ergibt
Val(str3,X,Result); X = 25000 Result = 0
.pa
9.5 STRING-Funktionen
In TURBO-Pascal stehen die folgenden Sandard-STRING-Funktionen
zur Verfuegung:
9.5.5 COPY-Funktion
Syntax Copy(str,pos,num);
Die Parameter sind:
str STRING-Ausdruck,
pos INTEGER-Ausdruck,
num INTEGER-Ausdruck.
Copy gibt einen String zurueck, der aus num Zeichen von str,
beginnend ab Position pos, besteht. Wenn pos > Laenge(str) ist,
besteht das Ergebnis aus der leeren Zeichenkette ''. Wenn pos+num
ausserhalb von str liegt, werden nur die innerhalb von str lie-
genden Zeichen zurueckgegeben. Liegt pos nicht in 1..255, so
entsteht ein Laufzeitfehler.
Beispiele:
Wenn str1 := 'ABCDEFG' , dann ist
str2 := Copy(str1,3,2); gleich 'CD'
str2 := Copy(str1,4,10); gleich 'DEFG'
str2 := Copy(str1,4,2); gleich 'DE'
9.5.2 CONCAT-Funktion
Syntax: Concat(str1,str2{,strN});
Die Parameter sind:
str1 STRING-Ausdruck,
str2 STRING-Ausdruck,
.... ...............
strN STRING-Ausdruck.
Die Anzahl N der STRING-Ausduecke ist beliebig. Das Ergebnis der
CONCAT-Funktion ist eine Zeichenkette, die aus den einzelnen
Zeichenketten durch Kettung entsteht und zwar in der gleichen
Reichenfolge, wie die STRING-Parameter in der Liste stehen. Wird
die Laenge groesser als 255, entsteht ein Laufzeitfehler. Man
kann, wie bereits in 9.3 erwaehnt, mit dem +-Operator das gleiche
erhalten. CONCAT sichert nur die Kompatibilitaet mit anderen
Compilern.
Beispiel:
str1 := 'TURBO ';
str2 := 'ist am schnellsten';
str3 := Concat(str1,'-Pascal ',str2); ergibt
str3 gleich 'TURBO-Pascal ist am schnellsten'
.pa
9.5.3 LENGTH-Funktion
Syntax: Length(str);
Der Parameter ist:
str STRING-Ausdruck.
Diese Funktion gibt die Laenge des STRING-Ausdruckes str zurueck,
d.h. die Anzahl der Zeichen von str. Der Typ des Ergebnisses ist
Integer.
Beispiel:
str := '123456789';
Length(str) ist gleich 9.
9.5.4 POS-Funktion
Syntax: Pos(obj,target);
Die Parameter sind:
obj STRING-Ausdruck,
target STRING-Ausdruck.
Der Ergebnistyp ist Integer. Die POS-Funktion durchsucht den
String target nach dem String obj. Das Ergebnis ist die Position
in target, an der das erste Zeichen von obj steht. Wenn obj nicht
in target gefunden wurde, gibt POS den Wert 0 zurueck.
Beispiele:
str := 'ABCDEFG';
Pos('BC',str) ergibt 2,
Pos('H',str) ergibt 0.
9.6 STRINGS und CHARACTER
STRING-Typen und Standard-Skalar-Typen CHAR sind kompatibel.
Deshalb kann man ueberall dort, wo STRING-Werte erlaubt sind,
CHAR-Werte einsetzen und umgekehrt. Weiterhin kann man STRINGS
und CHARACTER in Ausdruecken mischen. Wenn einem CHARACTER ein
STRING-Wert zugewiesen wird, muss die Laenge des STRING genau 1
sein, sonst wird ein Laufzeitfehler angezeigt. Man kann die
einzelnen Zeichen einer STRING-Variablen durch Indizierung errei-
chen. Dies geschieht durch Anfuegen eines Indexausdruckes vom
INTEGER-Typ, eingeschlossen in eckigen Klammern, an den Bezeich-
ner der STRING-Variablen.
Beispiele:
Buffers[5]
Line[Length(Line)-1]
Ord(Line[0])
Das erste Zeichen eines STRING (mit Index 0) enhaelt die STRING-
Laenge. Dies ist genau der Wert von Ord(Line[0]). Wenn jedoch vom
Programmierer der Laengenindikator selbst geaendert wird, muss er
auch selbst sichern, dass dieser die maximale Laenge der STRING-
Variablen nicht uebersteigt. Wenn die Compiler-Direktive R aktiv
ist {$R+}, wird ein Code generiert, der sichert, dass der Wert
des STRING-Index-Ausdruckes die maximale Laenge der STRING-
Variablen nicht uebersteigt. Es ist jedoch auch moeglich, einen
String ueber seine aktuelle dynamische Laenge hinaus zu indizie-
ren. Die dann gelesenen Zeichen haben jedoch rein zufaellige
Werte und haben keinerlei Bezug zu den wirklichen Werten der
STRING-Variablen.
.pa