Kapitel 3: LPC Datentypen

3.1 Was bereits bekannt sein sollte
LPC-Objekte beinhalten keine oder mehr Variablen, die von einer oder mehreren
Funktionen manipuliert werden. In welcher Reihenfolge diese Funktionen im
Code auftauchen, ist irrelevant. Der DRIVER benutzt diesen Code, indem er ihn
in den Hauptspeicher laed, wenn er zum ersten Mal referenziert wird, und
Kopien, wenn das Objekt gecloned wird, bzw, wenn das Objekt dafuer ausgelegt
ist, als virtuelle Kopie, um Speicher zu sparen. Wenn ein Objekt im
Arbeitsspeicher ist, sind seine Variablen ohne Werte deklariert, was bedeutet,
dass lediglich ein Speicherbereich fuer diese Variablen reserviert wurde.
Die Funktion create() initialisiert die Variablen und vergibt Werte.
So keine anderen Werte angegeben wurden, ist das Null, ansonsten der
vorgegebene Wert. Die Funktion create() wird sofort aufgerufen, wenn das
Objekt in den Hauptspeicher geladen wird. Wie das passiert, ist an dieser
Stelle noch unwichtig, wird aber noch behandelt. Bevor wir in Kapitel 4
intensiver die Funktionen betrachten, werden wir uns zuerst mit den
Datentypen, die in Kapitel 2 bereits kurz angeschnitten worden sind, als
wir Variablen betrachtet haben, beschaeftigen. Es mag das langweiligste
Kapitel sein, jedoch ist es auch eins der Wichtigsten, da falsche Datentypen
der Fehler Nummer 1 sind, wenn man mal von den Irrungen im Klammerdschungel
absieht. (Wenn wir spaeter Funktionen behandeln, wirst Du sehen, was es
mit dem Begriff auf sich hat)
Zusammen machen diese beiden Fehlerarten, also Klammerdschungel und falsch
deklarierte Variablen mehr als 90% der Fehler, die in der Praxis auftauchen,
aus. Meiner Meinung nach wirst Du, wenn Du dieses Kapitel verstanden hast,
einfacher und besser dahinter kommen, wie man effizient programmiert und
Deine Fehler schneller finden.

3.2 Kommunikation mit dem Computer
Wie Du wahrscheinlich weisst, kann ein Computer die Zahlen und Buchstaben,
die die Menschen benutzen, nicht verstehen. Die "Sprache", die der Computer
"spricht", besteht aus einem sehr uebersichtlichen "Alphabet" aus 0 und 1.
Natuerlich versteht der Computer auch keine menschliche Sprache. Aber
Fakt ist, dass sie auch nicht die Programmiersprachen, die die Menschen
beherrschen, verstehen. Programmiersprachen wie BASIC, C, C++, Pascal, und
auch LPC! sind also nur Zwischensprachen, die der menschlichen Sprache
aehnlich sind, und von speziellen Programmen, den Compilern und Interpretern,
in die reine Maschinensprache (also die 0 und 1) uebersetzt werden.

Es gibt zwei Arten, in denen diese Uebersetzung vonstatten gehen kann.
Diese Arten sind die Compilierung mit Hilfe eines Compilers und die
Interpretation durch einen Interpreter.
Bei der Compilierung schreibt der Programmierer zuerst den Code und nutzt
dann einen Compiler, um das Programm in Maschinensprache zu uebersetzen.
Diese Uebersetzung wird vor dem Programmablauf durchgefuehrt.
Falls bei der Uebersetzung ein Fehler auftauchen sollte, wird Dieser vor dem
Programmablauf gemeldet und die Uebersetzung abgebrochen.
Am Ende der Compilierung steht ein ausfuehrbares Programm, dass ohne weitere
Software lauffaehig ist.
Typische Compilersprachen sind C, C++ und Pascal.
Im Gegensatz dazu stehen die Interpretersprachen.
Ein Interpreter uebersetzt bei Bedarf ein Programm Stueck fuer Stueck.
Fehler tauchen erst beim Ausfuehren auf.
Bei jedem Programmaufruf wird der Code neu interpretiert.
Interpretersprachen produzieren damit einen sehr viel langsameren Code.
Typische Interpretersprachen sind BASIC und JAVA.
LPC ist eine Mischform, da der Code zur Laufzeit bei Bedarf compiliert wird,
und dann im Arbeitsspeicher verbleibt.

Das Einzige, was Du Dir merken musst, ist, dass es egal ist, welche Sprache Du
nutzt, sie wird irgendwie in Maschinensprache, also 0 und 1 uebersetzt, damit
der Computer Dich versteht. Und wie teilst Du dem Computer mit, wie er eine
Zeichenkette verarbeiten soll, oder eine Ganzzahl?
Durch Datentypen.

Ein Beispiel:
Wir nehmen uns eine Variable, und nennen sie nach alter mathematischer
Tradition 'x'.
Dieser Variable weisen wir die Ganzzahl 65 zu.
In LPC wuerde man es so machen: x=65;

Spaeter kannst Du mit x diverse Sachen machen.
Beispiele:
write(x+"\n"); (\n ist der Zeilenumbruch)
y=x+5;

Im ersten Beispiel wird x ausgegeben und im zweiten Beispiel wird der
Variable y der Wert von x, der um 5 erhoeht wird, uebergeben.
Zuweisungen von Werten werden immer von rechts nach links durchgefuehrt.

Wir haben 2 Variablen:
x=65;
und
y=70;
Was wuerde passieren, wenn wir nun schreiben wuerden:
x=y=4711; ?
Es gibt mehrere Ideen:
1. Idee:
x=70;
und
y=4711;

2. Idee:
x=4711;
y=4711;

Da die Zuweisungen von rechts nach links durchgefuehrt werden, wird die
Zuweisung wie folgt auseinander genommen:
1. Schritt: y=4711;
2. Schritt: x=y;
Damit ist die zweite Idee richtig.

Das, was Du als 65 ansiehst, ist fuer den Rechner das, was er unter
00000000000000000000000001000001
versteht.
Der Computer versteht aber unter
00000000000000000000000001000001
auch den Buchstaben 'A'.
Wie soll er wissen, dass Du, wenn Du ihm befiehlst:
write(x+"\n"); eine Ausgabe haben willst, die so aussieht:
65
und keine Ausgabe, die folgendermassen aussieht:
A
Das wird durch Datentypen erreicht.
Ein Datentyp sagt lediglich aus, was fuer Daten in der Variable
gespeichert werden.
Diese Datentypen sind standardisiert und entsprechen Denen (mit ein paar
Ausnahmen) von C.
Um das oben angesprochene Problem zu loesen, haettest Du vorher schreiben
muessen:
int x;

Diese eine Zeile teilt dem Driver Folgendes mit:
Immer, wenn ein Objekt den Inhalt der Variable x haben moechte, soll der
Datentyp int benutzt werden.
int ist die Kurzform fuer integer, also eine Ganzzahl.

3.3 Die Datentypen in LPC
Es gibt folgende Datentypen:
void
status
int
string
object
int *
string *
object *
mixed *
float
mapping
float *
mapping *

function
enum
struct
char

3.4 Einfache Datentypen
Dieses Handbuch wird sich nur mit einigen wenigen, haeufig gebrauchten
Datentypen beschaeftigen. Die einfachsten Datentypen sind int und string.

int ist, wie wir bereits wissen, eine Ganzzahl.
Beispiele waeren: 1, 42, -17, 0, -14423232
string ist einer oder mehrere alphanumerische Zeichen.
Beispiele waeren: "a", "doof", "42" oder "Ich bin ein String"
Es ist zu beachten, dass Strings in Anfuehrungszeichen("") eingebettet
werden, damit der Driver den Unterschied zwischen int 42 und string "42"
erkennt, genauso wie es einen Unterschied gibt, zwischen der Variable x und
dem string "x"
Immer wenn Du eine Variable im Code benutzt, musst Du dem Driver zuerst
mitteilen, welcher Datentyp welcher Variable zugeordnet ist. Das wird
"Deklaration" genannt. Das geschieht entweder am Anfang der Funktion,
wenn Du diese Variable nur in der Funktion benutzen willst
(dann spricht man von einer lokalen Variable) oder am Beginn des
Objekt-Codes (das nennt sich dann eine globale Objektvariable).
Das ist an diesem Beispiel hoffentlich ersichtlich:

int y;

void zwei_plus_zwei()
{
 int x;

 x=2;
 y=x+x;
}
void drei()
{
 y=3;
}

Wird die Funktion zwei_plus_zwei() aufgerufen, wird y den Wert 4 haben.
Wird die Funktion drei() aufgerufen, wird y den Wert 3 haben.

Dies sind zwei vollstaendige Funktionen.
Zuerst wird die Variable y als globale Objektvariable deklariert.
Diese Variable ist in beiden Funktionen bekannt.
In der Funktion zwei_plus_zwei() wird die Variable x deklariert, die
allerdings nur in dieser Funktion bekannt ist.

Der Datentyp void ist fuer Variablen etwas sinnlos, jedoch wird er von
Funktionen benutzt.
void bedeutet, dass die Variable, so es eine waere, auf NICHTS gesetzt ist.
Sie ist auch nicht auf andere Werte setzbar.
Das ist wichtig, der Rest, warum es diesen Datentyp gibt, wird sich im
naechsten Kapitel erschliessen.
Der Datentyp status ist ein Wahrheitswert-Typ. (boolscher Typ).
Das heisst, er kann nur 0 oder 1 als Wert enthalten.

3.5 Zusammenfassung
Um Variablen verarbeiten zu koennen, muss der Driver wissen, wie er die 0'en
und 1'en, die der Computer im Speicher haelt, in die Form ueberfuehren kann,
die Du moechtest. Die einfachsten Datentypen sind void, status, int und
string. Variablen vom Typ void sind nicht zu verwenden, da dieser
Datentyp fuer Funktionen vorbehalten ist, doch dazu spaeter mehr.
Zusaetzlich weiss der Driver anhand des Datentyps, wie er Operatoren (+,- etc)
zu behandeln hat. Beim Datentyp int weiss er zum Beispiel, dass der
Ausdruck 5+5 so ausgewertet werden soll, dass er die Werte 5 und 5 nimmt,
und aus diesen Werten einen neuen Wert (10) berechnet. Da eine int-Addition mit
Strings sinnlos ist, wandelt der Driver bei dem Beispiel "5"+5 den int-Wert
in einen String("5") um, und addiert die Strings.
Das sieht so aus, dass einfach an den ersten String der zweite String
angehaengt wird. Das Ergebnis lautet damit "55".
Andere Operationen mit Strings, speziell Multiplikation und Division, sind
nicht moeglich.
Der Driver wird mit einer liebevollen Fehlermeldung antworten, wenn Du etwas
versuchst, dass inetwa so aussieht: "das ist"/"Unsinn".
mud.tamedhon.de:4711 ON
mud.tamedhon.de:4712 (TLS) ON
mud.tamedhon.de:4713 (Webclient) ON