<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
		<id>https://www.rail-sim.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Patrick</id>
		<title>Rail-Sim.de - Train Simulator Wiki - Benutzerbeiträge [de]</title>
		<link rel="self" type="application/atom+xml" href="https://www.rail-sim.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Patrick"/>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Spezial:Beitr%C3%A4ge/Patrick"/>
		<updated>2026-04-20T09:05:56Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Sichtfeld_einstellen&amp;diff=1252</id>
		<title>Sichtfeld einstellen</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Sichtfeld_einstellen&amp;diff=1252"/>
				<updated>2012-06-02T16:16:01Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:Sichtwinkel.jpg|miniatur|300px|Das Bild mit dem Sichtwinkel von 45° wirkt deutlich realistischer. ]]Das [http://de.wikipedia.org/wiki/Sichtfeld Sichtfeld] (Fachwort: Field of View, FOV) beschreibt einen Blickwinkel der Kamera.&lt;br /&gt;
&lt;br /&gt;
Im RailWorks wird dieser Blickwinkel in Grad angegeben und besitzt einen Standardwert von 65°. Da ein Sichtwinkel von 65° unrealistisch ist und für abnormale Verzerrungen der Objekte sorgt, ist es ratsam, diesen auf einen Winkel von 45° einzustellen.&lt;br /&gt;
&lt;br /&gt;
== Manuelles einstellen des Winkels ==&lt;br /&gt;
&lt;br /&gt;
Um dies zu erreichen, ist folgende Vorgehensweise notwendig:&lt;br /&gt;
&lt;br /&gt;
# Öffnen Sie das RailWorks-Stammverzeichnis.&lt;br /&gt;
# Öffnen Sie den Datei &amp;quot;dev\scripts\engineScript.lua&amp;quot;, Kontextmenü -&amp;gt; Öffnen mit... -&amp;gt; Editor.&lt;br /&gt;
# In den Funktionen autorunDEBUG() und autorun()...&lt;br /&gt;
# ...ersetzen Sie das Argument in setFOV() mit dem gewünschten Winkel (45 empfohlen).&lt;br /&gt;
# Datei speichern.&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie sich eine Sicherheitskopie von der Datei, wenn Sie im Umgang mit Lua-Scripten nicht vertraut sind.&lt;br /&gt;
&lt;br /&gt;
In der Funktion setDof() können Sie die Entfernungen für die [http://de.wikipedia.org/wiki/Sch%C3%A4rfentiefe Tiefenunschärfe] (Fachwort: Depth of Field, DOF) einstellen. Das erste Argument beschreibt die Entfernung, in der die Tiefenunschärfe beginnt; Das zweite Argument beschreibt die Entfernung, in der die Tiefenunschärfe voll ausgeprägt ist.&lt;br /&gt;
&lt;br /&gt;
== Hintergrundinformationen ==&lt;br /&gt;
&lt;br /&gt;
Die Perspektive wird in visuellen Programmen mithilfe einer Perspektivenmatrix (Fachwort: Perspective Matrix) gesteuert. Das Resultat einer Perspektivenmatrix ist ein View Frostum, in dem Objekte projeziert werden. Durch die Projektion werden Punkte aus dem Sichtraum (Fachwort: View Space) in das richtige Bildverhältnis gesetzt.&lt;br /&gt;
&lt;br /&gt;
Die Perspektivenmatrix wird aus dem Field of View, Aspect Ratio, minimalen Sichttiefe und maximalen Sichttiefe beschrieben. Das Aspect Ratio ist hierbei ein Verhältnis, das via Bildbreite/Bildhöhe berechnet wird.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Sichtfeld_einstellen&amp;diff=1251</id>
		<title>Sichtfeld einstellen</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Sichtfeld_einstellen&amp;diff=1251"/>
				<updated>2012-06-02T10:19:17Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:Sichtwinkel.jpg|miniatur|300px|Das Bild mit dem Sichtwinkel von 45° wirkt deutlich realistischer. ]]Das [http://de.wikipedia.org/wiki/Sichtfeld Sichtfeld] (Fachwort: Field of View, FOV) beschreibt einen Blickwinkel der Kamera.&lt;br /&gt;
&lt;br /&gt;
Im RailWorks wird dieser Blickwinkel in Grad angegeben und besitzt einen Standardwert von 65°. Da ein Sichtwinkel von 65° unrealistisch ist und für abnormale Verzerrungen der Objekte sorgt, ist es ratsam, diesen auf einen Winkel von 45° einzustellen.&lt;br /&gt;
&lt;br /&gt;
== Manuelles einstellen des Winkels ==&lt;br /&gt;
&lt;br /&gt;
Um dies zu erreichen, ist folgende Vorgehensweise notwendig:&lt;br /&gt;
&lt;br /&gt;
# Öffnen Sie das RailWorks-Stammverzeichnis.&lt;br /&gt;
# Öffnen Sie den Datei &amp;quot;dev\scripts\engineScript.lua&amp;quot;, Kontextmenü -&amp;gt; Öffnen mit... -&amp;gt; Editor.&lt;br /&gt;
# In den Funktionen autorunDEBUG() und autorun()...&lt;br /&gt;
# ...ersetzen Sie das Argument in setFOV() mit dem gewünschten Winkel (45 empfohlen).&lt;br /&gt;
# Datei speichern.&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie sich eine Sicherheitskopie von der Datei, wenn Sie im Umgang mit Lua-Scripten nicht vertraut sind.&lt;br /&gt;
&lt;br /&gt;
In der Funktion setDof() können Sie die Entfernungen für die [http://de.wikipedia.org/wiki/Sch%C3%A4rfentiefe Tiefenunschärfe] (Fachwort: Depth of Field, DOF) einstellen. Das erste Argument beschreibt die Entfernung, in der die Tiefenunschärfe beginnt; Das zweite Argument beschreibt die Entfernung, in der Sie voll ausgeprägt ist.&lt;br /&gt;
&lt;br /&gt;
== Hintergrundinformationen ==&lt;br /&gt;
&lt;br /&gt;
Die Perspektive wird in visuellen Programmen mithilfe einer Perspektivenmatrix (Fachwort: Perspective Matrix) gesteuert. Das Resultat einer Perspektivenmatrix ist ein View Frostum, in dem Objekte projeziert werden. Durch die Projektion werden Punkte aus dem Sichtraum (Fachwort: View Space) in das richtige Bildverhältnis gesetzt.&lt;br /&gt;
&lt;br /&gt;
Die Perspektivenmatrix wird aus dem Field of View, Aspect Ratio, minimalen Sichttiefe und maximalen Sichttiefe beschrieben. Das Aspect Ratio ist hierbei ein Verhältnis, das via Bildbreite/Bildhöhe berechnet wird.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Sichtfeld_einstellen&amp;diff=1250</id>
		<title>Sichtfeld einstellen</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Sichtfeld_einstellen&amp;diff=1250"/>
				<updated>2012-06-02T10:16:21Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:Sichtwinkel.jpg|miniatur|300px|Das Bild mit dem Sichtwinkel von 45° wirkt deutlich realistischer. ]]Das [http://de.wikipedia.org/wiki/Sichtfeld Sichtfeld] (Fachwort: Field of View, FOV) beschreibt einen Blickwinkel der Kamera.&lt;br /&gt;
&lt;br /&gt;
Im RailWorks wird dieser Blickwinkel in Grad angegeben und besitzt einen Standardwert von 65°. Da ein Sichtwinkel von 65° unrealistisch ist und für abnormale Verzerrungen der Objekte sorgt, ist es ratsam, diesen auf einen Winkel von 45° einzustellen.&lt;br /&gt;
&lt;br /&gt;
== Manuelles einstellen des Winkels ==&lt;br /&gt;
&lt;br /&gt;
Um dies zu erreichen, ist folgende Vorgehensweise notwendig:&lt;br /&gt;
&lt;br /&gt;
# Öffnen Sie das RailWorks-Stammverzeichnis.&lt;br /&gt;
# Öffnen Sie den Datei &amp;quot;dev\scripts\engineScript.lua&amp;quot;, Kontextmenü -&amp;gt; Öffnen mit... -&amp;gt; Editor.&lt;br /&gt;
# In den Funktionen autorunDEBUG() und autorun()...&lt;br /&gt;
# ...ersetzen Sie das Argument in setFOV() mit dem gewünschten Winkel (45 empfohlen).&lt;br /&gt;
# Datei speichern.&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie sich eine Sicherheitskopie von der Datei, wenn Sie im Umgang mit Lua-Scripten nicht vertraut sind.&lt;br /&gt;
&lt;br /&gt;
In der Funktion setDof() können Sie die Entfernungen für die [http://de.wikipedia.org/wiki/Sch%C3%A4rfentiefe Tiefenunschärfe] (Fachwort: Depth of Field, DOF) einstellen. Das erste Argument beschreibt die Entfernung, in der die Tiefenunschärfe beginnt; Das zweite Argument beschreibt die Entfernung, in der Sie voll ausgeprägt ist.&lt;br /&gt;
&lt;br /&gt;
== Hintergrundinformationen ==&lt;br /&gt;
&lt;br /&gt;
Die Perspektive wird in visuellen Programmen mithilfe einer Perspektivenmatrix (Fachwort: Perspective Matrix) gesteuert. Das Resultat einer Perspektivenmatrix ist ein View Frostum, in dem Objekte projeziert werden. Durch die Projektion werden Punkte aus dem Sichtraum (Fachwort: View Space) in das richtige Bildverhältnis gesetzt.&lt;br /&gt;
&lt;br /&gt;
Die Perspektivenmatrix wird aus dem Field of View, Aspect Ratio, minimalen Sichttiefe und maximalen Sichttiefe beschrieben. Das Aspect Ratio ist hierbei ein Verhältnis, das via Bildbreite/Bildhöhe berechnet wird.&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Datei:Sichtwinkel.jpg&amp;diff=1249</id>
		<title>Datei:Sichtwinkel.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Datei:Sichtwinkel.jpg&amp;diff=1249"/>
				<updated>2012-06-02T10:08:44Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: Der korrekte Sichtwinkel beträgt 45°. Der falsche Standardwert von RailWorks beträgt 65°. Das Bild mit dem Sichtwinkel von 45° wirkt deutlich realistischer.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der korrekte Sichtwinkel beträgt 45°. Der falsche Standardwert von RailWorks beträgt 65°. Das Bild mit dem Sichtwinkel von 45° wirkt deutlich realistischer.&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Sichtfeld_einstellen&amp;diff=1248</id>
		<title>Sichtfeld einstellen</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Sichtfeld_einstellen&amp;diff=1248"/>
				<updated>2012-06-02T09:29:00Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das [http://de.wikipedia.org/wiki/Sichtfeld Sichtfeld] (Fachwort: Field of View, FOV) beschreibt einen Blickwinkel der Kamera.&lt;br /&gt;
&lt;br /&gt;
Im RailWorks wird dieser Blickwinkel in Grad angegeben und besitzt einen Standardwert von 65°. Da ein Sichtwinkel von 65° unrealistisch ist und für abnormale Verzerrungen der Objekte sorgt, ist es ratsam, diesen auf einen Winkel von 45° einzustellen.&lt;br /&gt;
&lt;br /&gt;
== Manuelles einstellen des Winkels ==&lt;br /&gt;
&lt;br /&gt;
Um dies zu erreichen, ist folgende Vorgehensweise notwendig:&lt;br /&gt;
&lt;br /&gt;
# Öffnen Sie das RailWorks-Stammverzeichnis.&lt;br /&gt;
# Öffnen Sie den Datei &amp;quot;dev\scripts\engineScript.lua&amp;quot;, Kontextmenü -&amp;gt; Öffnen mit... -&amp;gt; Editor.&lt;br /&gt;
# In den Funktionen autorunDEBUG() und autorun()...&lt;br /&gt;
# ...ersetzen Sie das Argument in setFOV() mit dem gewünschten Winkel (45 empfohlen).&lt;br /&gt;
# Datei speichern.&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie sich eine Sicherheitskopie von der Datei, wenn Sie im Umgang mit Lua-Scripten nicht vertraut sind.&lt;br /&gt;
&lt;br /&gt;
In der Funktion setDof() können Sie die Entfernungen für die [http://de.wikipedia.org/wiki/Sch%C3%A4rfentiefe Tiefenunschärfe] (Fachwort: Depth of Field, DOF) einstellen. Das erste Argument beschreibt die Entfernung, in der die Tiefenunschärfe beginnt; Das zweite Argument beschreibt die Entfernung, in der Sie voll ausgeprägt ist.&lt;br /&gt;
&lt;br /&gt;
== Hintergrundinformationen ==&lt;br /&gt;
&lt;br /&gt;
Die Perspektive wird in visuellen Programmen mithilfe einer Perspektivenmatrix (Fachwort: Perspective Matrix) gesteuert. Das Resultat einer Perspektivenmatrix ist ein View Frostum, in dem Objekte projeziert werden. Durch die Projektion werden Punkte aus dem Sichtraum (Fachwort: View Space) in das richtige Bildverhältnis gesetzt.&lt;br /&gt;
&lt;br /&gt;
Die Perspektivenmatrix wird aus dem Field of View, Aspect Ratio, minimalen Sichttiefe und maximalen Sichttiefe beschrieben. Das Aspect Ratio ist hierbei ein Verhältnis, das via Bildbreite/Bildhöhe berechnet wird.&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Sichtfeld_einstellen&amp;diff=1247</id>
		<title>Sichtfeld einstellen</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Sichtfeld_einstellen&amp;diff=1247"/>
				<updated>2012-06-02T09:28:22Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
&lt;br /&gt;
Das [http://de.wikipedia.org/wiki/Sichtfeld Sichtfeld] (Fachwort: Field of View, FOV) beschreibt einen Blickwinkel der Kamera.&lt;br /&gt;
&lt;br /&gt;
Im RailWorks wird dieser Blickwinkel in Grad angegeben und besitzt einen Standardwert von 65°. Da ein Sichtwinkel von 65° unrealistisch ist und für abnormale Verzerrungen der Objekte sorgt, ist es ratsam, diesen auf einen Winkel von 45° einzustellen.&lt;br /&gt;
&lt;br /&gt;
== Manuelles einstellen des Winkels ==&lt;br /&gt;
&lt;br /&gt;
Um dies zu erreichen, ist folgende Vorgehensweise notwendig:&lt;br /&gt;
&lt;br /&gt;
# Öffnen Sie das RailWorks-Stammverzeichnis.&lt;br /&gt;
# Öffnen Sie den Datei &amp;quot;dev\scripts\engineScript.lua&amp;quot;, Kontextmenü -&amp;gt; Öffnen mit... -&amp;gt; Editor.&lt;br /&gt;
# In den Funktionen autorunDEBUG() und autorun()...&lt;br /&gt;
# ...ersetzen Sie das Argument in setFOV() mit dem gewünschten Winkel (45 empfohlen).&lt;br /&gt;
# Datei speichern.&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie sich eine Sicherheitskopie von der Datei, wenn Sie im Umgang mit Lua-Scripten nicht vertraut sind.&lt;br /&gt;
&lt;br /&gt;
In der Funktion setDof() können Sie die Entfernungen für die [http://de.wikipedia.org/wiki/Sch%C3%A4rfentiefe Tiefenunschärfe] (Fachwort: Depth of Field, DOF) einstellen. Das erste Argument beschreibt die Entfernung, in der die Tiefenunschärfe beginnt; Das zweite Argument beschreibt die Entfernung, in der Sie voll ausgeprägt ist.&lt;br /&gt;
&lt;br /&gt;
== Hintergrundinformationen ==&lt;br /&gt;
&lt;br /&gt;
Die Perspektive wird in visuellen Programmen mithilfe einer Perspektivenmatrix (Fachwort: Perspective Matrix) gesteuert. Das Resultat einer Perspektivenmatrix ist ein View Frostum, in dem Objekte projeziert werden. Durch die Projektion werden Punkte aus dem Sichtraum (Fachwort: View Space) in das richtige Bildverhältnis gesetzt.&lt;br /&gt;
&lt;br /&gt;
Die Perspektivenmatrix wird aus dem Field of View, Aspect Ratio, minimalen Sichttiefe und maximalen Sichttiefe beschrieben. Das Aspect Ratio ist hierbei ein Verhältnis, das via Bildbreite/Bildhöhe berechnet wird.&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Sichtfeld_einstellen&amp;diff=1246</id>
		<title>Sichtfeld einstellen</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Sichtfeld_einstellen&amp;diff=1246"/>
				<updated>2012-06-02T09:27:14Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: Die Seite wurde neu angelegt: „= Beschreibung =  Das [http://de.wikipedia.org/wiki/Sichtfeld Sichtfeld] (Fachwort: Field of View, FOV) beschreibt einen Blickwinkel der Kamera.  Im RailWorks …“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Beschreibung =&lt;br /&gt;
&lt;br /&gt;
Das [http://de.wikipedia.org/wiki/Sichtfeld Sichtfeld] (Fachwort: Field of View, FOV) beschreibt einen Blickwinkel der Kamera.&lt;br /&gt;
&lt;br /&gt;
Im RailWorks wird dieser Blickwinkel in Grad angegeben und besitzt einen Standardwert von 65°. Da ein Sichtwinkel von 65° unrealistisch ist und für abnormale Verzerrungen der Objekte sorgt, ist es ratsam, diesen auf einen Winkel von 45° einzustellen.&lt;br /&gt;
&lt;br /&gt;
= Manuelles einstellen des Winkels =&lt;br /&gt;
&lt;br /&gt;
Um dies zu erreichen, ist folgende Vorgehensweise notwendig:&lt;br /&gt;
&lt;br /&gt;
# Öffnen Sie das RailWorks-Stammverzeichnis.&lt;br /&gt;
# Öffnen Sie den Datei &amp;quot;dev\scripts\engineScript.lua&amp;quot;, Kontextmenü -&amp;gt; Öffnen mit... -&amp;gt; Editor.&lt;br /&gt;
# In den Funktionen autorunDEBUG() und autorun()...&lt;br /&gt;
# ...ersetzen Sie das Argument in setFOV() mit dem gewünschten Winkel (45 empfohlen).&lt;br /&gt;
# Datei speichern.&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie sich eine Sicherheitskopie von der Datei, wenn Sie im Umgang mit Lua-Scripten nicht vertraut sind.&lt;br /&gt;
&lt;br /&gt;
In der Funktion setDof() können Sie die Entfernungen für die [http://de.wikipedia.org/wiki/Sch%C3%A4rfentiefe Tiefenunschärfe] (Fachwort: Depth of Field, DOF) einstellen. Das erste Argument beschreibt die Entfernung, in der die Tiefenunschärfe beginnt; Das zweite Argument beschreibt die Entfernung, in der Sie voll ausgeprägt ist.&lt;br /&gt;
&lt;br /&gt;
= Hintergrundinformationen =&lt;br /&gt;
&lt;br /&gt;
Die Perspektive wird in visuellen Programmen mithilfe einer Perspektivenmatrix (Fachwort: Perspective Matrix) gesteuert. Das Resultat einer Perspektivenmatrix ist ein View Frostum, in dem Objekte projeziert werden. Durch die Projektion werden Punkte aus dem Sichtraum (Fachwort: View Space) in das richtige Bildverhältnis gesetzt.&lt;br /&gt;
&lt;br /&gt;
Die Perspektivenmatrix wird aus dem Field of View, Aspect Ratio, minimalen Sichttiefe und maximalen Sichttiefe beschrieben. Das Aspect Ratio ist hierbei ein Verhältnis, das via Bildbreite/Bildhöhe berechnet wird.&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Scriptsprache_Lua&amp;diff=660</id>
		<title>Scriptsprache Lua</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Scriptsprache_Lua&amp;diff=660"/>
				<updated>2011-09-19T15:36:48Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: Hinzufügung des Tutorials #2.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Übersicht über Tutorials mit dem Thema LUA Scripting.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Das Lua-Tutorial - 1 Grundlagen|Das Lua-Tutorial - #1 Grundlagen]]&lt;br /&gt;
* [[Das Lua-Tutorial - 2 Tipps und Bibliotheken|Das Lua-Tutorial - #2 Tipps und Bibliotheken]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Das_Lua-Tutorial_-_2_Tipps_und_Bibliotheken&amp;diff=659</id>
		<title>Das Lua-Tutorial - 2 Tipps und Bibliotheken</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Das_Lua-Tutorial_-_2_Tipps_und_Bibliotheken&amp;diff=659"/>
				<updated>2011-09-19T15:35:03Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: Die Seite wurde neu angelegt: „= Das Lua-Tutorial - #2 Tipps und Bibliotheken = Im ersten Teil wurde geklärt, was eine Skriptsprache ist, welchen Editor man für die Bearbeitung nehmen sollte.…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Das Lua-Tutorial - #2 Tipps und Bibliotheken =&lt;br /&gt;
Im ersten Teil wurde geklärt, was eine Skriptsprache ist, welchen Editor man für die Bearbeitung nehmen sollte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Es wurden die wichtigsten Sprachelemente wie Variablen, If-Else-Verzweigungen, Schleifen, Funktionen und Tabellen vorgestellt.&lt;br /&gt;
&lt;br /&gt;
Am Ende dieses Teils beherrscht man folgende Grundlagen&lt;br /&gt;
* Lösen von Programmierfehlern&lt;br /&gt;
* Zurechtfinden im offiziellen Lua-Handbuch&lt;br /&gt;
* Vereinfachen gängiger Arbeiten&lt;br /&gt;
* Projektorganisation und Teamarbeit&lt;br /&gt;
* Allgemeine Funktionen und die math-Bibliothek&lt;br /&gt;
&lt;br /&gt;
== Lösen von Programmierfehlern ==&lt;br /&gt;
&lt;br /&gt;
Die meisten Fehlerquellen kennt jeder:&lt;br /&gt;
* Tippfehler&lt;br /&gt;
* Nichtbeachtung der Großschreibung&lt;br /&gt;
* Übergabe eines fehlerhaften Parameters&lt;br /&gt;
* Illegaler Aufruf einer Funktion&lt;br /&gt;
* Zugriff auf eine Variable, die nicht existiert&lt;br /&gt;
* Logikfehler&lt;br /&gt;
Doch wenn diese Fehler auftreten, können besonders die letzteren viel Suchzeit in Arbeit beanspruchen, sogar einige Tage.&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT02_01_Fehlermeldung.png|rahmenlos|links|397px]][[Datei:PP_LUATUT02_02_Bug_Report.png|rahmenlos|links|397px]]&lt;br /&gt;
Tippfehler sind schnell zu finden: Stimmt der Quellcode nicht,&amp;lt;br/&amp;gt;meldet der Interpreter, dass etwas nicht stimmt und benennt&amp;lt;br/&amp;gt;&lt;br /&gt;
möglichst genau die betroffene Stelle. Dazu klickt im&amp;lt;br/&amp;gt;Dialog der Fehlermeldung auf „Show Bug Report“ und findet Informationen&amp;lt;br/&amp;gt;&lt;br /&gt;
zum System, den Prozessen und vor allem: Welcher Fehler eingetreten ist&amp;lt;br/&amp;gt;(und eventuell warum) – Rot eingerahmt.&amp;lt;br/&amp;gt;&lt;br /&gt;
In diesem Fall habe ich zum Beispiel statt „function“ „funktion“&amp;lt;br/&amp;gt;für einen Funktionsrumpf geschrieben (Zeile 20).&lt;br /&gt;
&lt;br /&gt;
Man sieht: Diese Fehlerquelle ist leicht zu finden und schnell zu lösen.&lt;br /&gt;
&lt;br /&gt;
Die Nichtbeachtung der Groß- und Kleinschreibung führt schnell zu&amp;lt;br/&amp;gt;fehlerhaften Funktionsnamen und Variablen.&lt;br /&gt;
&lt;br /&gt;
Hier helfen nur drei Methoden:&lt;br /&gt;
* Folge dem Quellcode und schaue nach,&amp;lt;br/&amp;gt;ob irgendetwas falsch geschrieben wurde.&lt;br /&gt;
* Halte dazu beim Programmieren für Funktionen, Variablen&amp;lt;br/&amp;gt;und Tabellen eine einheitliche Namensgebung ein (siehe unten).&lt;br /&gt;
* Untersuche Argumente und Variablen mit einer&amp;lt;br/&amp;gt;selbstgebauten DebugMessage()-Funktion (siehe Teil 1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Prüfung eines fehlerhaften Arguments kann schnell erledigt sein. Dazu gibt es folgende Möglichkeiten:&lt;br /&gt;
* Gib mit der Funktion DebugMessage() eine Informationsnachricht mit den Parametern aus.&lt;br /&gt;
* Prüfe die Werte auf Gültigkeit, indem der Wertebereich überprüft wird. Überprüfe Variablen auch auf den Wert nil.&lt;br /&gt;
&lt;br /&gt;
Ein illegaler Aufruf einer Funktion kann einen fatalen Fehler auslösen: Solche Fehler lösen einen zwanghaften Fehlerdialog aus.&amp;lt;br/&amp;gt;&lt;br /&gt;
Bekommt eine Funktion Argumente, die außerhalb des zu erwartenden Wertebereiches sind, kann sie entweder Fehlermeldungen ausgeben&lt;br /&gt;
oder löst ein unvorhergesehenes Verhalten aus.&lt;br /&gt;
&lt;br /&gt;
Möchte man prüfen, ob eine Variable ungültig ist, muss man Sie nur gegen den Wertebereich oder nil prüfen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da es allerdings viele Variablen im Quellcode gibt, ist dieses Verfahren sehr aufwendig.&lt;br /&gt;
&lt;br /&gt;
Logikfehler lösen ein unerwartetes Programmverhalten aus. Hier gibt es nur eine Lösung:&lt;br /&gt;
* Verhalten beobachten, schildern&lt;br /&gt;
* Auf dem Papier das Ganze an einem Worst-Case-Szenario durcharbeiten.&amp;lt;br/&amp;gt;Tipp: Mit Microsoft® Visio® kann man die Logik an Flussdiagrammen visualisieren.&lt;br /&gt;
* Logik verändern und beobachten was passiert&lt;br /&gt;
&lt;br /&gt;
Fehler sind vielschichtig, doch für alles gibt es eine Lösung. Es hilft auch, wenn man seine persönlichen Lieblingsfehler kennt,&amp;lt;br/&amp;gt;&lt;br /&gt;
denn dann weiß man, wo man anfangen soll!&lt;br /&gt;
&lt;br /&gt;
Eine weitere Lösung kann das Kommentieren sein: Diese Kommunikationsaufgabe hilft Fehler schneller zu verstehen!&lt;br /&gt;
&lt;br /&gt;
== Das Lua-Handbuch ==&lt;br /&gt;
Zur Skriptsprache Lua gibt es ein offizielles Handbuch. Das Handbuch ist im Dokumentationsbereich auf der offiziellen Seite&amp;lt;br/&amp;gt;&lt;br /&gt;
von Lua (http://www.lua.org) zu finden. Der Direktlink zum Lua 5.1 Reference Manual lautet http://www.lua.org/manual/5.1/.&lt;br /&gt;
&lt;br /&gt;
Es ist zu beachten, dass das Handbuch nur auf Englisch verfügbar ist nur alle Funktionen allgemein schreibt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Teilweise ist Vorwissen aus anderen Programmiersprachen notwendig, um die Hintergründe zu verstehen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Für uns sind die Punkte „2 - The Language“ und „5 - Standard Libraries“ wichtig. Die restlichen Punkte sind für&amp;lt;br/&amp;gt;&lt;br /&gt;
Anwendungsprogrammierer oder Sprachentwickler wichtig. &lt;br /&gt;
&lt;br /&gt;
Die Sprachdokumentation ist allgemein als Text mit Beispielen beschrieben.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Funktionen werden mit der Definition vorgestellt, was diese Bewirkt und deren Voraussetzungen,&amp;lt;br/&amp;gt;&lt;br /&gt;
die Bedeutung der Parameter und der Wertebereich der Argumente sowie die zu erwartenden Rückgabewerte.&lt;br /&gt;
&lt;br /&gt;
Die Inhaltsübersicht auf der Hauptseite listet die einzelnen Themen auf. Scrollt man auf der Hauptseite herunter,&amp;lt;br/&amp;gt;&lt;br /&gt;
sind alle eigenen Lua-Funktionen aufgelistet. Auf der rechten Spalte findet man unter dem Namen „C API“ und „auxilary library“&amp;lt;br/&amp;gt;&lt;br /&gt;
eine Dokumentation für Anwendungsprogrammierer.&lt;br /&gt;
&lt;br /&gt;
== Vereinfachen gängiger Arbeiten ==&lt;br /&gt;
Dieser Abschnitt hätte auch den Titel „Tipps zum Überleben“ bekommen können. Und darum geht es jetzt: Tipps,&amp;lt;br/&amp;gt;&lt;br /&gt;
damit das Chaos vermieden wird. Die Funktion von Kommentaren wurde im ersten Teil geklärt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Dennoch gibt es viele Fragen, wie man diese sinnvoll anwendet. Es folgen ein paar Tipps und Vorlagen:&lt;br /&gt;
&lt;br /&gt;
=== Informationen zur Datei ===&lt;br /&gt;
Wie beschrieben sollten hier Informationen stehen, was die Datei allgemein macht, wer sie geschrieben hat,&amp;lt;br/&amp;gt;&lt;br /&gt;
wann sie geschrieben und was an ihr verändert wurde. Zusatzinformationen wie die verwendete Lizenz,&amp;lt;br/&amp;gt;&lt;br /&gt;
die Dokumentationssprache und der Name der Gruppe tragen ebenfalls zur Übersicht bei und sind teilweise Pflicht.&amp;lt;br/&amp;gt;&lt;br /&gt;
Das folgende Bild zeigt eine exemplarische Dokumentation (ohne Lizenz):&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT02_03_HeaderDoc.png|rahmenlos|605px]]&lt;br /&gt;
&lt;br /&gt;
=== Beschreibung globaler Definitionen ===&lt;br /&gt;
Im Grunde müssen globale Definitionen nur beschreiben, was diese bedeuten. Beispiel:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT02_04_GlobalVar.png|rahmenlos|830px]]&lt;br /&gt;
&lt;br /&gt;
=== Funktionen ===&lt;br /&gt;
Funktionen benötigen ebenfalls eine Dokumentation (ganz wichtig!):&lt;br /&gt;
* Was macht die Funktion?&lt;br /&gt;
* Welche Parameter gibt es? Welche Argumente sind gültig? Abhängigkeiten?&lt;br /&gt;
* Welche Rückgabewerte sind zu erwarten? Fehlerbehandlung?&lt;br /&gt;
&lt;br /&gt;
Hierzu ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT02_05_Funktionen.png|rahmenlos|604px]]&lt;br /&gt;
&lt;br /&gt;
Aufgabenfelder / Programmblöcke / Rümpfe&lt;br /&gt;
&lt;br /&gt;
Hier sollte man nicht beschreiben, was die Sprachkonstrukte machen, sondern warum bestimmte Prozesse notwendig sind und wie diese&amp;lt;br/&amp;gt; zusammenhängen. Diese Dokumentation sollte den Logikprozess abbilden – und nicht die Sprache. Ein Beispiel siehe oben bei den Funktionen&amp;lt;br/&amp;gt; (Warum interessiert mich die Nachricht überhaupt nicht?).&lt;br /&gt;
&lt;br /&gt;
Wie benennt man Variablen und Funktionen?&lt;br /&gt;
&lt;br /&gt;
Nach dem vereinbarten Muster der Gruppe. Doch es gibt Grundregeln: &amp;#039;&amp;#039;&amp;#039;P&amp;#039;&amp;#039;&amp;#039;ascal&amp;#039;&amp;#039;&amp;#039;C&amp;#039;&amp;#039;&amp;#039;ase oder &amp;#039;&amp;#039;&amp;#039;c&amp;#039;&amp;#039;&amp;#039;amel&amp;#039;&amp;#039;&amp;#039;C&amp;#039;&amp;#039;&amp;#039;ase.&lt;br /&gt;
&lt;br /&gt;
Globale Definitionen werden oftmals &amp;lt;code&amp;gt;KOMPLETT_GROSS&amp;lt;/code&amp;gt; und mit Unterstrich in Worte getrennt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;pxpPZB_MGN_2000&amp;lt;/code&amp;gt; ist so ein Beispiel. Der Name der Gruppe (&amp;lt;code&amp;gt;pxp&amp;lt;/code&amp;gt;) wurde hier vor der Definition klein angefügt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ansonsten schreibe ich Variablen im PascalCase: &amp;lt;code&amp;gt;TrainSpeed&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Globalen Variablen bekommen bei mir ein sogenanntes Prefix: &amp;lt;code&amp;gt;g_&amp;lt;/code&amp;gt;. Damit ist eindeutig, dass diese Variable global ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;g_TrainData&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Wenn möglich, schreibe ich Funktionen im camelCase. Damit die Funktionsgruppe erkennbar ist,&amp;lt;br/&amp;gt;&lt;br /&gt;
nutze ich ein Verb: &amp;lt;code&amp;gt;create&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;release&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;is&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;has&amp;lt;/code&amp;gt;. Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;function isPZBContactActive()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ganze Prinzip wird in den folgenden Beispielprojekten (z.B. Signale) sicherlich klar.&lt;br /&gt;
&lt;br /&gt;
== Projektorganisation und Teamarbeit ==&lt;br /&gt;
Projekte sollten einen eigenen Ordner bekommen, wenn dies möglich ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
Alle Dateien eines Projekts sollten in einem eigenen Ordner nach Funktion sortiert werden. Z.B.&lt;br /&gt;
* Objekte in „Meshes“&lt;br /&gt;
* Texturen in „Textures“&lt;br /&gt;
* Vorlagen in „Templates“&lt;br /&gt;
* Skripte in „Scripts“&lt;br /&gt;
* Grundmodelle in „Template Meshes“&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, dass man alle Daten einer bestimmten Version zuordnen kann, damit der Austausch der Dateien einfach vonstattengeht.&lt;br /&gt;
&lt;br /&gt;
Die Versionsverwaltung kann man für relativ kleine Projekte manuell selbst auf einem Downloadserver durchführen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ein paar FTP-Accounts und schon kann das Austauschen beginnen. Eine Teamplattform ist natürlich von Vorteil.&lt;br /&gt;
&lt;br /&gt;
Für größere Projekte, an denen viele Mitarbeiter (ab 5) arbeiten, empfiehlt es sich eine Software zu nehmen&amp;lt;br/&amp;gt;&lt;br /&gt;
und einen Online-Server, auf denen man mit wenigen Klicks alles austauschen kann.&lt;br /&gt;
&lt;br /&gt;
Eine solche Software ist zum Beispiel TortoiseSVN mit einem passenden Onlinespeicher. Dieses Verfahren&amp;lt;br/&amp;gt;&lt;br /&gt;
wird in einem anderen Tutorial beschrieben, da es den Rahmen dieses Tutorials sprengen würde.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wichtig ist: Sei auf den neuesten Stand und gib Bescheid, wenn Daten aktualisiert worden sind.&amp;lt;br/&amp;gt;&lt;br /&gt;
Und dokumentiere was wo wann geändert wurde.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Die Mathematikbibliothek ==&lt;br /&gt;
Dieser Abschnitt stellt die wichtigsten Funktionen und die Mathematikbibliothek vor.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Funktionen ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 | assert(value[, message]) || Löst einen fatalen Fehler aus, wenn value false oder nil ist.&amp;lt;br/&amp;gt;Gibt die Nachricht message aus.&lt;br /&gt;
 |-&lt;br /&gt;
 | dofile(filepath) || Führt eine Datei aus. Der Arbeitsordner (Current Working Directory)&amp;lt;br/&amp;gt;bezieht sich auf den Ordner, in dem sich die RailWorks.exe befindet.&lt;br /&gt;
 |-&lt;br /&gt;
 | print(text) || Schreibt text in die Konsole bzw. schreibt ihn in die Log-Datei.&lt;br /&gt;
 |-&lt;br /&gt;
 | tonumber(text) || Wandelt text in eine Zahl um. Gibt nil zurück, wenn es nicht funktionierte.&lt;br /&gt;
 |-&lt;br /&gt;
 | tostring(value) || Wandelt einen Wert in einen Text um.&lt;br /&gt;
 |-&lt;br /&gt;
 | type(value) || Gibt den Datentyp von value in Textform zurück:&amp;lt;br/&amp;gt;„nil“, „number“, „string“, „table“, „function“, „boolean“, „thread“ oder „userdata“.&lt;br /&gt;
 |-&lt;br /&gt;
 | key, value = inpairs(table) || Für die generische For-Schleife. Iteriert eine Tabelle.&amp;lt;br/&amp;gt;key besitzt den Namen des Schlüssels, value den Wert.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT02_06_Math.png|rahmenlos|267px]]&lt;br /&gt;
&lt;br /&gt;
=== Die Bibliothek math ===&lt;br /&gt;
Der Zugriff auf die math-Bibliothek erfolgt über die Tabelle math: math.(Funktion). Die wichtigsten Funktionen sind fett markiert.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;#039;&amp;#039;&amp;#039;abs(x)&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Gibt den absoluten Wert von x zurück.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 |-&lt;br /&gt;
 | acos(x) || Gibt den Arkuscosinus von x in Radiant zurück.&lt;br /&gt;
 |-&lt;br /&gt;
 | asin(x) || Gibt den Arkussinus von x in Radiant zurück.&lt;br /&gt;
 |-&lt;br /&gt;
 | atan(x) || Gibt den Arkustangens von x in Radiant zurück.&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;#039;&amp;#039;&amp;#039;ceil(x)&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Rundet die Zahl x auf (Ganzzahl).&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 |-&lt;br /&gt;
 | cos(x) || Berechnet den Cosinus von x in Radiant.&lt;br /&gt;
 |-&lt;br /&gt;
 | cosh(x) || Berechnet den Cosinus Hyperbolicus von x in Radiant.&lt;br /&gt;
 |-&lt;br /&gt;
 | deg(radian) || Berechnet den Winkel in Grad von radian.&lt;br /&gt;
 |-&lt;br /&gt;
 | exp(x) || Berechnet e^x.&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;#039;&amp;#039;&amp;#039;floor(x)&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Rundet x ab&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
 |-&lt;br /&gt;
 | fmod(x, y) || Gibt den Rest der Division x/y zurück. Er ist zwischen [0 und &amp;lt; y).&lt;br /&gt;
 |-&lt;br /&gt;
 | frexp(x) || Gibt m und e so zurück, dass x = m * pow(2, e) gilt. e ist eine Ganzzahl und der absolute Wert&amp;lt;br/&amp;gt;von m ist zwischen [0.5 und 1) – oder 0 wenn x 0 ist.&lt;br /&gt;
 |-&lt;br /&gt;
 | huge (Variable) || Der größte anzunehmende Zahlenwert.&lt;br /&gt;
 |-&lt;br /&gt;
 | ldexp(m, e) || Berechnet m * exp(x).&lt;br /&gt;
 |-&lt;br /&gt;
 | log(x) || Berechnet den natürlichen Logarithmus 〖log〗_e (x).&lt;br /&gt;
 |-&lt;br /&gt;
 | log10(x) || Berechnet 〖log〗_10 (x).&lt;br /&gt;
 |-&lt;br /&gt;
 | max(a, b, …) || Gibt den größten aller Werte zurück.&lt;br /&gt;
 |-&lt;br /&gt;
 | min(a, b, …) || Gibt den kleinsten aller Werte zurück.&lt;br /&gt;
 |-&lt;br /&gt;
 | modf(x) || Gibt zwei Werte von x zurück: Den Integralen (Ganzzahl) und den Rationalen.&lt;br /&gt;
 |-&lt;br /&gt;
 | pi (Variable) || π (3.1415…)&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;#039;&amp;#039;&amp;#039;pow(x, n)&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Berechnet x^n&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
 |-&lt;br /&gt;
 | rad(degree) || Wandelt einen Winkel von Grad nach Radiant um.&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;#039;&amp;#039;&amp;#039;random([max[, min])&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Berechnet eine Zufallszahl. Wenn max angegeben ist, ist der Wert zwischen 0 bis max.&amp;lt;br/&amp;gt;Wenn min angegeben ist, zwischen min bis max. Ansonsten von 0 bis 1.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 |-&lt;br /&gt;
 | randomseed(x) || Setzt den Seed des Zufallsgenerators.&lt;br /&gt;
 |-&lt;br /&gt;
 | sin(x) || Berechnet den Sinus von x in Radiant.&lt;br /&gt;
 |-&lt;br /&gt;
 | sinh(x) || Berechnet den Sinus Hyperbolicus von x in Radiant.&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;#039;&amp;#039;&amp;#039;sqrt(x)&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Wurzel aus x. x muss größer als 0 sein.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 |-&lt;br /&gt;
 | tan(x) || Berechnet den Tangens von x in Radiant.&lt;br /&gt;
 |-&lt;br /&gt;
 | tanh(x) || Berechnet den Tangens Hyperbolicus von x in Radiant.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung des Teils ==&lt;br /&gt;
In diesem Teil wurden Programmiertipps gegeben. Zudem wurden die wichtigsten Funktionen und die Mathematikbibliothek vorgestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Es gibt noch weitere Bibliotheken: Dazu ist ein Blick in die offizielle Dokumentation unverzichtbar: „5 - Standard Libraries“.&lt;br /&gt;
&lt;br /&gt;
Im nächsten Teil werden Besonderheiten bezüglich RailWorks 3 vorgestellt.&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT02_06_Math.png&amp;diff=658</id>
		<title>Datei:PP LUATUT02 06 Math.png</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT02_06_Math.png&amp;diff=658"/>
				<updated>2011-09-19T15:34:11Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: Ausgabe von Zufallswerten in Lua.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ausgabe von Zufallswerten in Lua.&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT02_05_Funktionen.png&amp;diff=657</id>
		<title>Datei:PP LUATUT02 05 Funktionen.png</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT02_05_Funktionen.png&amp;diff=657"/>
				<updated>2011-09-19T15:32:53Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: Beispielhafte Funktionsdokumentation in Lua.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beispielhafte Funktionsdokumentation in Lua.&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT02_04_GlobalVar.png&amp;diff=656</id>
		<title>Datei:PP LUATUT02 04 GlobalVar.png</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT02_04_GlobalVar.png&amp;diff=656"/>
				<updated>2011-09-19T15:31:52Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: Beispielhafte Dokumentation von globalen Variablen in Lua.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beispielhafte Dokumentation von globalen Variablen in Lua.&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT02_03_HeaderDoc.png&amp;diff=655</id>
		<title>Datei:PP LUATUT02 03 HeaderDoc.png</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT02_03_HeaderDoc.png&amp;diff=655"/>
				<updated>2011-09-19T15:30:38Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: Beispiel einer Lua-Headerdokumentation.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beispiel einer Lua-Headerdokumentation.&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT02_02_Bug_Report.png&amp;diff=654</id>
		<title>Datei:PP LUATUT02 02 Bug Report.png</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT02_02_Bug_Report.png&amp;diff=654"/>
				<updated>2011-09-19T15:26:11Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: Lua Error Report in LuaEdit.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Lua Error Report in LuaEdit.&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT02_01_Fehlermeldung.png&amp;diff=653</id>
		<title>Datei:PP LUATUT02 01 Fehlermeldung.png</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT02_01_Fehlermeldung.png&amp;diff=653"/>
				<updated>2011-09-19T15:24:39Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: Fehlermeldung-Dialog in LuaEdit.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Fehlermeldung-Dialog in LuaEdit.&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Das_Lua-Tutorial_-_1_Grundlagen&amp;diff=646</id>
		<title>Das Lua-Tutorial - 1 Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Das_Lua-Tutorial_-_1_Grundlagen&amp;diff=646"/>
				<updated>2011-09-18T21:53:09Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: /* Schleifen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Scriptsprache Lua]]&lt;br /&gt;
&lt;br /&gt;
= Das Lua-Tutorial - 1 Grundlagen =&lt;br /&gt;
&lt;br /&gt;
Diese Artikelserie zeigt, wie man mit Lua eigene Funktionen in das Programm einbinden kann. „#1 – Grundlagen“ erklärt das Fundament von Lua und wie man damit arbeitet. Es ist spezifisch für RailWorks ausgelegt.&lt;br /&gt;
&lt;br /&gt;
== Was ist Lua und was benötige ich? ==&lt;br /&gt;
&lt;br /&gt;
Lua ist eine Formsprache, mit der man ein Programm von außen steuern kann. Was heißt „außen“ und wie ist das gemeint?&lt;br /&gt;
&lt;br /&gt;
Ein Programm besitzt einen inneren Kern, der immer gleich abläuft – er ist fest verankert und damit von „innen“ gesteuert.&lt;br /&gt;
Wir können ihn mit normalen Mitteln nicht verändern. Lässt ein Programm zu, dass es veränderbar ist,&lt;br /&gt;
dann lässt es eine Steuerung von außen zu. Das kann mit einer Konfigurationsdatei („Bildschirmauflösung einstellen“)&lt;br /&gt;
oder einem Script gelöst sein. Das Script sagt was der Kern erledigen soll.&lt;br /&gt;
Und diese Scripte werden zum Beispiel mit Lua geschrieben – darum geht es hier.&lt;br /&gt;
&lt;br /&gt;
Um solche Scripte zu schreiben, muss man einer Formsprache exakt folgen. Das ist wie Tangotanzen auf der Showbühne: Nur das unser Tanzpartner die Tastatur ist. Die Formsprache beschreibt uns die Regeln, wie etwas zu formulieren ist, welche Möglichkeiten gegeben sind und was dadurch ausgelöst wird.&lt;br /&gt;
&lt;br /&gt;
Natürlich passiert es schnell, dass mal nicht alles glatt läuft. Und zum Glück gibt es Programme, die uns unterstützen, Fehler durch korrekten Text zu ersetzen. Diesen Text den wir schreiben, nennt man Quellcode.&lt;br /&gt;
&lt;br /&gt;
Ein Programm, das ich sehr gerne nutze und empfehle, ist [http://luaforge.net/frs/?group_id=84&amp;amp;release_id=553 LuaEdit 3.03RC]. Es ist einfach organisiert und ermöglicht eine schnelle Überprüfung der Formsprache. So sieht das Programm aus, wenn man Scripte schreibt (siehe rechts).&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_01_LuaEdit_3.03RC.png|miniatur|Die Entwicklungsumgebung [http://luaforge.net/frs/?group_id=84&amp;amp;release_id=553 LuaEdit 3.03RC] ]]&lt;br /&gt;
Oben haben wir ein Menü. Es ermöglicht allgemeine Operationen, Sichteinstellungen, Projektverwaltung, einen Test durchzuführen und das starten von Tools.&lt;br /&gt;
&lt;br /&gt;
In der oberen Toolleiste finden wir in der ersten Gruppe Felder zum erzeugen neuer Dateien oder Projekte.&lt;br /&gt;
In der zweiten Gruppe können wir Dateien öffnen und speichern. In der dritten Gruppe können wir&lt;br /&gt;
Dateien zu Projekten zuordnen. Die vierte Gruppe ermöglicht das Drucken. Die fünfte Gruppe kann&lt;br /&gt;
den Testdurchlauf beeinflussen. Die sechste Gruppe ermöglicht das Prüfen der Syntax und&lt;br /&gt;
das Erstellen von kompilierten Scripten. Die siebente Gruppe ermöglicht das Suchen und&lt;br /&gt;
das Setzen von Haltepunkten im Script, wenn wir einen Testdurchlauf durchführen.&lt;br /&gt;
&lt;br /&gt;
Die untere Toolleiste vereinfacht das Bearbeiten von Text. Dazu zählt zum Beispiel&lt;br /&gt;
das automatische Ein- und Auskommentieren oder Verrücken von Text.&lt;br /&gt;
Am besten probiert man an einem Testtext, was der jeweiligen Schalter bewirkt :-).&lt;br /&gt;
&lt;br /&gt;
Ich habe bei der Beschreibung das Wort „Kompilieren“ in den Raum geworfen.&lt;br /&gt;
Das ganze muss man sich so vorstellen: Wir schreiben Text in lesbarer Form,&lt;br /&gt;
den wir verändern können. Kompilieren wir den Text, wird unser geschriebenes&lt;br /&gt;
interpretiert und mit programmeigenen Anweisungen übersetzt. Die programmeigenen&lt;br /&gt;
Anweisungen können wir natürlich nicht ohne weiteres frei bearbeiten.&lt;br /&gt;
Das ganze macht man, damit man Zeit spart, weil die Interpretation manchmal&lt;br /&gt;
ganz schön lange dauern kann, wenn man sehr viele Scriptdateien hat.&lt;br /&gt;
Aber damit müssen wir uns in RailWorks nicht herumärgern: Das macht RailWorks für uns, leider.&lt;br /&gt;
&lt;br /&gt;
== Kommentieren hilft ==&lt;br /&gt;
&lt;br /&gt;
Scripten ist eine Gemeinschaftsaufgabe. Schreiben wir Quellcode, müssen wir später verstehen,&lt;br /&gt;
was wir geschrieben haben. Und unseren Mitgliedern hilft es, Fehler schneller und leichter zu entlarven,&lt;br /&gt;
um sie auszumerzen. Ein Kommentar ist dabei etwas, was nicht vom Interpreter (dem „Leser“) beachtet wird.&lt;br /&gt;
&lt;br /&gt;
Er wird mit zwei arabischen Zahlstrichen angefangen (--) und gilt für die eine Zeile. Etwa so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;-- Kommentare sind für folgende Fälle gedacht:&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Hinweise am Anfang der Dateien&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** wer, was, wann und wie etwas geändert hat.&lt;br /&gt;
** Falls notwendig: Nenne&lt;br /&gt;
*** die verwendete Sprache&lt;br /&gt;
*** den Namen der Gruppe&lt;br /&gt;
*** oder die Lizenz (und/oder deren Bedingungen).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Eigenschaften der Funktionen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** Was sie machen sollen oder bewirken&lt;br /&gt;
** Wann sie verwendet werden dürfen&lt;br /&gt;
** Welche Parameter zulässig sind und was sie bedeuten – die Einheiten&lt;br /&gt;
** Rückgabewerte, wenn Sie vorhanden sind&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Beschreibung der Aufgabenfelder&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** was wie erledigt werden soll&lt;br /&gt;
** welche Werte warum besondere Rollen spielen.&lt;br /&gt;
&lt;br /&gt;
Es ist ein logischer Prozess und wird eine Menge Schreibarbeit verursachen.&amp;lt;br/&amp;gt;Aber das Tutorial ist so ausgelegt, dass die „Kommunikationsaufgabe Kommentieren“ als Routine ein leichtes Spiel wird.&lt;br /&gt;
&lt;br /&gt;
== Variablen und Werte ==&lt;br /&gt;
&lt;br /&gt;
Informationen müssen gespeichert werden: Dieser Aufgabe werden Variablen gerecht.&amp;lt;br/&amp;gt;Ihre Werte werden durch logische Berechnungsprozesse oder festgelegte Logik bestimmt.&lt;br /&gt;
&lt;br /&gt;
Damit man unterscheiden kann, was Werte beinhalten, unterteilt man diese in Dateitypen.&amp;lt;br/&amp;gt;Für uns wichtig kann sein:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 ! Datentyp !! Beschreibung !! Beispiel&lt;br /&gt;
 |-&lt;br /&gt;
 | string || Ein Text aus einer Verkettung von Zeichen. || „Hallo Welt“&lt;br /&gt;
 |-&lt;br /&gt;
 | number || Eine Zahl. Bei Gleitkommazahlen schreibt man mit Punkt statt mit Komma. &amp;lt;br/&amp;gt;Ein „f“ kann zusätzlich stehen und hat für uns keine Bedeutung. || 3, 5, 9&amp;lt;br/&amp;gt;2.6, 3.1415f&lt;br /&gt;
 |-&lt;br /&gt;
 | Boolean || Ein Wahrheitswert. Wahr oder Falsch. || Wert: true oder false&lt;br /&gt;
 |-&lt;br /&gt;
 | nil || Eine Variable, die keinen Wert hat: Datentyplos. || Wert: nil&lt;br /&gt;
 |-&lt;br /&gt;
 | table || Eine Tabelle: „Array“. || Definition: { }&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Der Datentyp wird zur Laufzeit gewählt und ist bei vielen Typen austauschbar.&amp;lt;br/&amp;gt;So kann ein string zum Beispiel zu einer Zahl umgewandelt werden, wenn dies möglich ist.&amp;lt;br/&amp;gt;Ein Wahrheitswert, eine Zahl oder auch nil kann zu einem Text umgewandelt werden.&lt;br /&gt;
&lt;br /&gt;
Die Definition einer Variable ist einfach – man schreibt sie in folgender Form auf:&lt;br /&gt;
&lt;br /&gt;
[Name] = [Wert]&lt;br /&gt;
&lt;br /&gt;
Dazu ein paar Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_02_Variablendefinitionen.png|rahmenlos|231px|Variablendefinitionen in Lua.]]&lt;br /&gt;
&lt;br /&gt;
Ganz links ist die Zeilennummer, Einzustellen in den Optionen von LuaEdit.&lt;br /&gt;
Die Namensgebung von Variablen entspricht den obigen Beispielen:&amp;lt;br/&amp;gt;Sie darf mit einem Buchstaben anfangen, der keine Nummer ist. Nach dem ersten Buchstaben darf man Nummern verwenden – das meidet man allerdings.&lt;br /&gt;
&lt;br /&gt;
== Operatoren ==&lt;br /&gt;
&lt;br /&gt;
Beim Programmieren unterscheidet man in drei Arten von Operationen:&lt;br /&gt;
* Arithmetische Operationen (Rechenoperationen)&lt;br /&gt;
* Relationale Operationen (Vergleichsoperationen) und&lt;br /&gt;
* Logische Operationen&lt;br /&gt;
&lt;br /&gt;
Jede Gruppe deckt bestimmte Aufgabenfelder ab. So dienen arithmetische Operationen&amp;lt;br/&amp;gt;der Berechnung von Werten und relationale und logische Operationen dem Vergleich von Werten.&lt;br /&gt;
&lt;br /&gt;
Dieser Abschnitt beschäftigt sich mit Rechenoperationen. Das sind die Operatoren&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;=&amp;quot; --&amp;gt; Zuweisungsoperator&lt;br /&gt;
* &amp;quot;+&amp;quot; --&amp;gt; Additionsoparator&lt;br /&gt;
* &amp;quot;-&amp;quot; --&amp;gt; Subtraktionsoperator oder auch Negationsoperator&lt;br /&gt;
* &amp;quot;*&amp;quot; --&amp;gt; Multiplikationsoperator&lt;br /&gt;
* &amp;quot;/&amp;quot; --&amp;gt; Divisionsoperator&lt;br /&gt;
* &amp;quot;..&amp;quot; --&amp;gt; Verknüpfungsoperator&lt;br /&gt;
&lt;br /&gt;
Um diese Funktion zu verdeutlichen, dienen folgende Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_03_ArOperationen.png|rahmenlos|534px|Operatorenbeispiele in Lua]]&lt;br /&gt;
&lt;br /&gt;
== Kontrollstrukturen und Schleifen ==&lt;br /&gt;
&lt;br /&gt;
=== Anweisungen und Rümpfe ===&lt;br /&gt;
&lt;br /&gt;
Jede Anweisung wird in einem Rumpf ausgeführt. Dabei unterscheidet man in&lt;br /&gt;
* Anweisungsrümpfe&lt;br /&gt;
* Branchrümpfe&lt;br /&gt;
* Branchrümpfe der If-Else-Kontrollstrukturen&lt;br /&gt;
&lt;br /&gt;
Branchrümpfe begrenzen einen Programmblock und benötigen eine Bedingung:&lt;br /&gt;
&amp;lt;code&amp;gt;(Bedingung) &amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisung)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;end&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie werden mit then eingeleitet und mit end beendet.&lt;br /&gt;
&lt;br /&gt;
Anweisungsrümpfe der If-Else-Kontrollstrukturen werden wie Anweisungsrümpfe definiert,&amp;lt;br/&amp;gt;können jedoch ohne das Schlüsselwort end beendet werden, wenn sie mit elseif oder else beendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;if&amp;#039;&amp;#039;&amp;#039; (Bedingung) &amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisung)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;elseif&amp;#039;&amp;#039;&amp;#039; (Bedingung) &amp;#039;&amp;#039;&amp;#039;...&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anweisungen wie a = 2 können mit einem Semikolon angeschlossen werden,&amp;lt;br/&amp;gt;wie es in anderen Programmiersprachen üblich ist: a = 2;&lt;br /&gt;
&lt;br /&gt;
=== Wenn-Kontrollstrukturen ===&lt;br /&gt;
Im vorigen Abschnitt wurden logische Operatoren genannt – diese sind Bestandteil der Kontrollstrukturen und Schleifen.&amp;lt;br/&amp;gt;Unter Kontrollstrukturen kann man sich einfache Wenn-Verzweigungen vorstellen.&amp;lt;br/&amp;gt;Schleifen werden hingegen solange ausgeführt, wie die Bedingung zutrifft.&lt;br /&gt;
&lt;br /&gt;
Eine Verzweigung wird mit einer if-Bedingung realisiert:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;if&amp;#039;&amp;#039;&amp;#039; (Bedingung) &amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisungen)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;end&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Bedingungen werden mit Operatoren geprüft oder verknüpft. Die Vergleichsoperationen sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 ! Operator !! Bedeutung !! Beispiel&lt;br /&gt;
 |-&lt;br /&gt;
 | == || Gleichheitsoperator. Wahr wenn beide Werte gleich sind. || 5 == 5 --&amp;gt; Wahr&lt;br /&gt;
 |-&lt;br /&gt;
 | ~= || Ungleichheitsoperator. Wahr wenn beide Werte nicht gleich sind. || 5 ~= 5 --&amp;gt; Falsch&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;lt; || Kleiner-als-Operator. Wahr wenn der zu prüfende Wert kleiner ist als der andere. || 4 &amp;lt; 5 --&amp;gt; Wahr&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;lt;= || Kleiner-als-oder-gleich-Operator. Wahr wenn der zu prüfende Wert kleiner oder gleich dem anderen ist. || 5 &amp;lt;= 5 --&amp;gt; Wahr&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;gt; || Größer-als-Operator. Wahr wenn der zu prüfende Wert größer ist als der andere. || 6 &amp;gt; 5 --&amp;gt; Wahr&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;gt;= || Größer-als-oder-gleich-Operator. Wahr wenn der zu prüfende Wert größer oder gleich dem Anderen ist. || 5 &amp;gt;= 5 --&amp;gt; Wahr&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Vergleichsoperationen können verknüpft werden. Dazu dienen folgende Vergleichsoperationen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 ! Operator !! Bedeutung !! Beispiel&lt;br /&gt;
 |- &lt;br /&gt;
 | and || Und-Operator. Gibt wahr zurück, wenn beide Operanden wahr sind. || true and true --&amp;gt; Wahr&amp;lt;br/&amp;gt;true and false --&amp;gt; Falsch&lt;br /&gt;
 |- &lt;br /&gt;
 | or || Oder-Operator. Gibt wahr zurück, wenn ein Operand wahr ist. || false or false --&amp;gt; Falsch&amp;lt;br/&amp;gt;true or false --&amp;gt; Wahr&lt;br /&gt;
 |- &lt;br /&gt;
 | not || Wahrheits-Negations-Operator. Mach ein Wahr zu Falsch und ein Falsch zu wahr. || not true wird zu false&amp;lt;br/&amp;gt;not false wird zu true&lt;br /&gt;
 |}&lt;br /&gt;
Zusatzbemerkung: not ist vorrangig zu den arithmetischen Operatoren.&amp;lt;br/&amp;gt;Logikoperationen zu Vergleichsoperationen.&amp;lt;br/&amp;gt;Arithmetische Operationen vorrangig zu Logikoperationen.&amp;lt;br/&amp;gt;Zu Wahrheitswerten ist kein Vergleichsoperator notwendig – er wird immer gegen true geprüft.&lt;br /&gt;
&lt;br /&gt;
Oftmals ist es notwendig, weitere Fall-Abzweige zu programmieren.&amp;lt;br/&amp;gt;Vom Prinzip: wenn das… oder wenn das… oder das. Dies wird wird else-if-Kontrollstrukturen realisiert.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau dieser Kontrollstrukturen ist der Folgende:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;if&amp;#039;&amp;#039;&amp;#039; (Bedingung) &amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisungsblock den Fall)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;else&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisungsblock für unbehandelte Fälle)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;end&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;if&amp;#039;&amp;#039;&amp;#039; (Bedingung A) &amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisungsblock für Fall A)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;elseif&amp;#039;&amp;#039;&amp;#039; (Bedingung B) &amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisungsblock für Fall B)&amp;lt;br/&amp;gt;&lt;br /&gt;
(&amp;#039;&amp;#039;optional&amp;#039;&amp;#039;:	&amp;#039;&amp;#039;&amp;#039;else&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
			(Anweisungsblock für unbehandelte Fälle))&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;end&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um das ganze System zu verdeutlichen, dienen folgende Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_06_Vergleiche.png|473px]]&lt;br /&gt;
&lt;br /&gt;
=== Schleifen ===&lt;br /&gt;
Schleifen dienen zur Wiederholung einer Anweisung, solange eine bestimmte Bedingung gültig ist.&lt;br /&gt;
&lt;br /&gt;
Die einfachste Schleife ihrer Art ist die while-Schleife. Solange die Bedingung gültig ist,&amp;lt;br/&amp;gt;wird deren Anweisung im then-end-Block ausgeführt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;while&amp;#039;&amp;#039;&amp;#039; (Bedingung) &amp;#039;&amp;#039;&amp;#039;do&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisung)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;end&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Folgende Beispiel lässt den Wert c solange herunterzählen, bis c Null ist:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_07_While-Schleife.png|402px]]&lt;br /&gt;
&lt;br /&gt;
Dekrementieren = Zahl um 1 verringern. Inkrementieren = Zahl um 1 erhöhen.&lt;br /&gt;
&lt;br /&gt;
Manchmal ist es Notwendig, dass der Anweisungsblock vor der Bedingungsprüfung notwendig ist.&amp;lt;br/&amp;gt;Dazu dienen repeat-until-Schleifen – auch bekannt als do-while-Schleife.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;repeat&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisungen)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;until&amp;#039;&amp;#039;&amp;#039; (Bedingung)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_09_Repeat-Until-Schleife.png|310px]]&lt;br /&gt;
&lt;br /&gt;
Eine weitere interessante Schleife ist die numerische for-Schleife.&amp;lt;br/&amp;gt;In ihr ist die Deklaration, Zielwert und Schrittweite definiert. &amp;lt;br/&amp;gt;Folgende Form ist dabei zu beachten:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;for&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(Deklaration)&amp;#039;&amp;#039;, &amp;#039;&amp;#039;(Zielwert)&amp;#039;&amp;#039;(optional:, &amp;#039;&amp;#039;(Schrittweite)&amp;#039;&amp;#039;) &amp;#039;&amp;#039;&amp;#039;do&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
(Anweisung)&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;end&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist die Schrittweite nicht definiert (weil optional), wird 1 als Standardwert verwendet.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel berechnet c von 0 bis 10 als Folge:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_08_For-Schleife.png|501px]]&lt;br /&gt;
&lt;br /&gt;
== Funktionen ==&lt;br /&gt;
&lt;br /&gt;
Funktionen werden wie folgt aufgerufen:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;Funktionsname&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;(&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Argument&amp;#039;&amp;#039;, &amp;#039;&amp;#039;Argument&amp;#039;&amp;#039;, &amp;#039;&amp;#039;...&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;)&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;SendSignalMessage(PZB_500, ““, 1, 1, linkIndex)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Möchte man eigene Funktionen programmieren, verwendet man folgende Form:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;function&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Funktionsname&amp;#039;&amp;#039;(&amp;#039;&amp;#039;Parameter&amp;#039;&amp;#039;, &amp;#039;&amp;#039;Parameter&amp;#039;&amp;#039;, &amp;#039;&amp;#039;...&amp;#039;&amp;#039;)&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisungen)&amp;lt;br/&amp;gt;&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es sei noch zu erwähnen, dass man an Funktionen Argumente (Werte) übergibt und bei der Definition Parameter definiert.&amp;lt;br/&amp;gt;Folglich nennt man die übergebenen Argumente innerhalb einer Funktion Argument.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel zeigt die Deklaration der Funktion DebugMessage() und deren Aufruf.&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_10_Funktionen.png|604px]]&lt;br /&gt;
&lt;br /&gt;
Möchte man Rückgabewerte zurückgeben, wird dies mit dem Schlüsselwort &amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;return&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt; eingeleitet.&amp;lt;br/&amp;gt;In Lua ist es möglich mehrere Rückgabewerte zurückzuliefern.&amp;lt;br/&amp;gt;Das folgende Beispiel zeigt, wie das geht:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_11_Rückgabewerte.png|605px]]&lt;br /&gt;
&lt;br /&gt;
== Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Fast geschafft. Im letzten „Lernkapitel“ werden Tabellen behandelt. Tabellen werden auch als Arrays bezeichnet.&amp;lt;br/&amp;gt;Sie beinhalten Daten in Form von Schlüssel-Wert-Paaren.&lt;br /&gt;
&lt;br /&gt;
Eine Tabelle wird wie folgend deklariert:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Variable = &amp;#039;&amp;#039;&amp;#039;{}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist ebenfalls möglich, zur Deklaration Werte in Tabellen schreiben:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Variable = &amp;#039;&amp;#039;&amp;#039;{&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;VariablenName&amp;#039;&amp;#039; = &amp;#039;&amp;#039;Wert&amp;#039;&amp;#039;, &amp;#039;&amp;#039;...&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Zugriff ist vielseitig. Entweder greift man über eckige Klammern auf ein Schlüssel-Wert-Paar zu.&amp;lt;br/&amp;gt;Der Zugriff funktioniert auch über ein Tabelle-Punkt-Variablenname-System:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_12_Tabellen.png|538px]]&lt;br /&gt;
&lt;br /&gt;
Eine weitere Schleifenart ist die generische for-Schleife. Sie wird für Tabellen benutzt.&amp;lt;br/&amp;gt;Um sie zu realisieren benutzt man die Funktion &amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;inpairs(Tabelle)&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;. Das folgende Beispiel zeigt die Syntax:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_13_For-Generisch.png|377px]]&lt;br /&gt;
&lt;br /&gt;
== Ein paar Hinweise ==&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel gab einen Einblick in Lua und hat Grundlagen der Sprache vorgestellt.&amp;lt;br/&amp;gt;Nun beherrscht man die Sprache Lua im Allgemeinen.&lt;br /&gt;
&lt;br /&gt;
Doch was würde man ohne die Standardbibliotheken machen? Es gibt vorgefertigte Funktionen,&amp;lt;br/&amp;gt;zum Beispiel eine Mathematikbibliothek.&lt;br /&gt;
&lt;br /&gt;
Zudem wurde noch nicht auf Besonderheiten bezüglich RailWorks eingegangen.&lt;br /&gt;
&lt;br /&gt;
Dies folgt in den Artikeln:&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Das Lua-Tutorial - 2 Tipps und Bibliotheken|Das Lua-Tutorial: #2 – Die Lua-Bibliotheken]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Das Lua-Tutorial - 3 RailWorks: Besonderheiten und Funktionsübersucht|Das Lua-Tutorial: #3 – Besonderheiten und Funktionsübersucht]]&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Das_Lua-Tutorial_-_1_Grundlagen&amp;diff=645</id>
		<title>Das Lua-Tutorial - 1 Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Das_Lua-Tutorial_-_1_Grundlagen&amp;diff=645"/>
				<updated>2011-09-18T21:52:48Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: /* Schleifen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Scriptsprache Lua]]&lt;br /&gt;
&lt;br /&gt;
= Das Lua-Tutorial - 1 Grundlagen =&lt;br /&gt;
&lt;br /&gt;
Diese Artikelserie zeigt, wie man mit Lua eigene Funktionen in das Programm einbinden kann. „#1 – Grundlagen“ erklärt das Fundament von Lua und wie man damit arbeitet. Es ist spezifisch für RailWorks ausgelegt.&lt;br /&gt;
&lt;br /&gt;
== Was ist Lua und was benötige ich? ==&lt;br /&gt;
&lt;br /&gt;
Lua ist eine Formsprache, mit der man ein Programm von außen steuern kann. Was heißt „außen“ und wie ist das gemeint?&lt;br /&gt;
&lt;br /&gt;
Ein Programm besitzt einen inneren Kern, der immer gleich abläuft – er ist fest verankert und damit von „innen“ gesteuert.&lt;br /&gt;
Wir können ihn mit normalen Mitteln nicht verändern. Lässt ein Programm zu, dass es veränderbar ist,&lt;br /&gt;
dann lässt es eine Steuerung von außen zu. Das kann mit einer Konfigurationsdatei („Bildschirmauflösung einstellen“)&lt;br /&gt;
oder einem Script gelöst sein. Das Script sagt was der Kern erledigen soll.&lt;br /&gt;
Und diese Scripte werden zum Beispiel mit Lua geschrieben – darum geht es hier.&lt;br /&gt;
&lt;br /&gt;
Um solche Scripte zu schreiben, muss man einer Formsprache exakt folgen. Das ist wie Tangotanzen auf der Showbühne: Nur das unser Tanzpartner die Tastatur ist. Die Formsprache beschreibt uns die Regeln, wie etwas zu formulieren ist, welche Möglichkeiten gegeben sind und was dadurch ausgelöst wird.&lt;br /&gt;
&lt;br /&gt;
Natürlich passiert es schnell, dass mal nicht alles glatt läuft. Und zum Glück gibt es Programme, die uns unterstützen, Fehler durch korrekten Text zu ersetzen. Diesen Text den wir schreiben, nennt man Quellcode.&lt;br /&gt;
&lt;br /&gt;
Ein Programm, das ich sehr gerne nutze und empfehle, ist [http://luaforge.net/frs/?group_id=84&amp;amp;release_id=553 LuaEdit 3.03RC]. Es ist einfach organisiert und ermöglicht eine schnelle Überprüfung der Formsprache. So sieht das Programm aus, wenn man Scripte schreibt (siehe rechts).&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_01_LuaEdit_3.03RC.png|miniatur|Die Entwicklungsumgebung [http://luaforge.net/frs/?group_id=84&amp;amp;release_id=553 LuaEdit 3.03RC] ]]&lt;br /&gt;
Oben haben wir ein Menü. Es ermöglicht allgemeine Operationen, Sichteinstellungen, Projektverwaltung, einen Test durchzuführen und das starten von Tools.&lt;br /&gt;
&lt;br /&gt;
In der oberen Toolleiste finden wir in der ersten Gruppe Felder zum erzeugen neuer Dateien oder Projekte.&lt;br /&gt;
In der zweiten Gruppe können wir Dateien öffnen und speichern. In der dritten Gruppe können wir&lt;br /&gt;
Dateien zu Projekten zuordnen. Die vierte Gruppe ermöglicht das Drucken. Die fünfte Gruppe kann&lt;br /&gt;
den Testdurchlauf beeinflussen. Die sechste Gruppe ermöglicht das Prüfen der Syntax und&lt;br /&gt;
das Erstellen von kompilierten Scripten. Die siebente Gruppe ermöglicht das Suchen und&lt;br /&gt;
das Setzen von Haltepunkten im Script, wenn wir einen Testdurchlauf durchführen.&lt;br /&gt;
&lt;br /&gt;
Die untere Toolleiste vereinfacht das Bearbeiten von Text. Dazu zählt zum Beispiel&lt;br /&gt;
das automatische Ein- und Auskommentieren oder Verrücken von Text.&lt;br /&gt;
Am besten probiert man an einem Testtext, was der jeweiligen Schalter bewirkt :-).&lt;br /&gt;
&lt;br /&gt;
Ich habe bei der Beschreibung das Wort „Kompilieren“ in den Raum geworfen.&lt;br /&gt;
Das ganze muss man sich so vorstellen: Wir schreiben Text in lesbarer Form,&lt;br /&gt;
den wir verändern können. Kompilieren wir den Text, wird unser geschriebenes&lt;br /&gt;
interpretiert und mit programmeigenen Anweisungen übersetzt. Die programmeigenen&lt;br /&gt;
Anweisungen können wir natürlich nicht ohne weiteres frei bearbeiten.&lt;br /&gt;
Das ganze macht man, damit man Zeit spart, weil die Interpretation manchmal&lt;br /&gt;
ganz schön lange dauern kann, wenn man sehr viele Scriptdateien hat.&lt;br /&gt;
Aber damit müssen wir uns in RailWorks nicht herumärgern: Das macht RailWorks für uns, leider.&lt;br /&gt;
&lt;br /&gt;
== Kommentieren hilft ==&lt;br /&gt;
&lt;br /&gt;
Scripten ist eine Gemeinschaftsaufgabe. Schreiben wir Quellcode, müssen wir später verstehen,&lt;br /&gt;
was wir geschrieben haben. Und unseren Mitgliedern hilft es, Fehler schneller und leichter zu entlarven,&lt;br /&gt;
um sie auszumerzen. Ein Kommentar ist dabei etwas, was nicht vom Interpreter (dem „Leser“) beachtet wird.&lt;br /&gt;
&lt;br /&gt;
Er wird mit zwei arabischen Zahlstrichen angefangen (--) und gilt für die eine Zeile. Etwa so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;-- Kommentare sind für folgende Fälle gedacht:&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Hinweise am Anfang der Dateien&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** wer, was, wann und wie etwas geändert hat.&lt;br /&gt;
** Falls notwendig: Nenne&lt;br /&gt;
*** die verwendete Sprache&lt;br /&gt;
*** den Namen der Gruppe&lt;br /&gt;
*** oder die Lizenz (und/oder deren Bedingungen).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Eigenschaften der Funktionen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** Was sie machen sollen oder bewirken&lt;br /&gt;
** Wann sie verwendet werden dürfen&lt;br /&gt;
** Welche Parameter zulässig sind und was sie bedeuten – die Einheiten&lt;br /&gt;
** Rückgabewerte, wenn Sie vorhanden sind&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Beschreibung der Aufgabenfelder&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** was wie erledigt werden soll&lt;br /&gt;
** welche Werte warum besondere Rollen spielen.&lt;br /&gt;
&lt;br /&gt;
Es ist ein logischer Prozess und wird eine Menge Schreibarbeit verursachen.&amp;lt;br/&amp;gt;Aber das Tutorial ist so ausgelegt, dass die „Kommunikationsaufgabe Kommentieren“ als Routine ein leichtes Spiel wird.&lt;br /&gt;
&lt;br /&gt;
== Variablen und Werte ==&lt;br /&gt;
&lt;br /&gt;
Informationen müssen gespeichert werden: Dieser Aufgabe werden Variablen gerecht.&amp;lt;br/&amp;gt;Ihre Werte werden durch logische Berechnungsprozesse oder festgelegte Logik bestimmt.&lt;br /&gt;
&lt;br /&gt;
Damit man unterscheiden kann, was Werte beinhalten, unterteilt man diese in Dateitypen.&amp;lt;br/&amp;gt;Für uns wichtig kann sein:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 ! Datentyp !! Beschreibung !! Beispiel&lt;br /&gt;
 |-&lt;br /&gt;
 | string || Ein Text aus einer Verkettung von Zeichen. || „Hallo Welt“&lt;br /&gt;
 |-&lt;br /&gt;
 | number || Eine Zahl. Bei Gleitkommazahlen schreibt man mit Punkt statt mit Komma. &amp;lt;br/&amp;gt;Ein „f“ kann zusätzlich stehen und hat für uns keine Bedeutung. || 3, 5, 9&amp;lt;br/&amp;gt;2.6, 3.1415f&lt;br /&gt;
 |-&lt;br /&gt;
 | Boolean || Ein Wahrheitswert. Wahr oder Falsch. || Wert: true oder false&lt;br /&gt;
 |-&lt;br /&gt;
 | nil || Eine Variable, die keinen Wert hat: Datentyplos. || Wert: nil&lt;br /&gt;
 |-&lt;br /&gt;
 | table || Eine Tabelle: „Array“. || Definition: { }&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Der Datentyp wird zur Laufzeit gewählt und ist bei vielen Typen austauschbar.&amp;lt;br/&amp;gt;So kann ein string zum Beispiel zu einer Zahl umgewandelt werden, wenn dies möglich ist.&amp;lt;br/&amp;gt;Ein Wahrheitswert, eine Zahl oder auch nil kann zu einem Text umgewandelt werden.&lt;br /&gt;
&lt;br /&gt;
Die Definition einer Variable ist einfach – man schreibt sie in folgender Form auf:&lt;br /&gt;
&lt;br /&gt;
[Name] = [Wert]&lt;br /&gt;
&lt;br /&gt;
Dazu ein paar Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_02_Variablendefinitionen.png|rahmenlos|231px|Variablendefinitionen in Lua.]]&lt;br /&gt;
&lt;br /&gt;
Ganz links ist die Zeilennummer, Einzustellen in den Optionen von LuaEdit.&lt;br /&gt;
Die Namensgebung von Variablen entspricht den obigen Beispielen:&amp;lt;br/&amp;gt;Sie darf mit einem Buchstaben anfangen, der keine Nummer ist. Nach dem ersten Buchstaben darf man Nummern verwenden – das meidet man allerdings.&lt;br /&gt;
&lt;br /&gt;
== Operatoren ==&lt;br /&gt;
&lt;br /&gt;
Beim Programmieren unterscheidet man in drei Arten von Operationen:&lt;br /&gt;
* Arithmetische Operationen (Rechenoperationen)&lt;br /&gt;
* Relationale Operationen (Vergleichsoperationen) und&lt;br /&gt;
* Logische Operationen&lt;br /&gt;
&lt;br /&gt;
Jede Gruppe deckt bestimmte Aufgabenfelder ab. So dienen arithmetische Operationen&amp;lt;br/&amp;gt;der Berechnung von Werten und relationale und logische Operationen dem Vergleich von Werten.&lt;br /&gt;
&lt;br /&gt;
Dieser Abschnitt beschäftigt sich mit Rechenoperationen. Das sind die Operatoren&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;=&amp;quot; --&amp;gt; Zuweisungsoperator&lt;br /&gt;
* &amp;quot;+&amp;quot; --&amp;gt; Additionsoparator&lt;br /&gt;
* &amp;quot;-&amp;quot; --&amp;gt; Subtraktionsoperator oder auch Negationsoperator&lt;br /&gt;
* &amp;quot;*&amp;quot; --&amp;gt; Multiplikationsoperator&lt;br /&gt;
* &amp;quot;/&amp;quot; --&amp;gt; Divisionsoperator&lt;br /&gt;
* &amp;quot;..&amp;quot; --&amp;gt; Verknüpfungsoperator&lt;br /&gt;
&lt;br /&gt;
Um diese Funktion zu verdeutlichen, dienen folgende Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_03_ArOperationen.png|rahmenlos|534px|Operatorenbeispiele in Lua]]&lt;br /&gt;
&lt;br /&gt;
== Kontrollstrukturen und Schleifen ==&lt;br /&gt;
&lt;br /&gt;
=== Anweisungen und Rümpfe ===&lt;br /&gt;
&lt;br /&gt;
Jede Anweisung wird in einem Rumpf ausgeführt. Dabei unterscheidet man in&lt;br /&gt;
* Anweisungsrümpfe&lt;br /&gt;
* Branchrümpfe&lt;br /&gt;
* Branchrümpfe der If-Else-Kontrollstrukturen&lt;br /&gt;
&lt;br /&gt;
Branchrümpfe begrenzen einen Programmblock und benötigen eine Bedingung:&lt;br /&gt;
&amp;lt;code&amp;gt;(Bedingung) &amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisung)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;end&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie werden mit then eingeleitet und mit end beendet.&lt;br /&gt;
&lt;br /&gt;
Anweisungsrümpfe der If-Else-Kontrollstrukturen werden wie Anweisungsrümpfe definiert,&amp;lt;br/&amp;gt;können jedoch ohne das Schlüsselwort end beendet werden, wenn sie mit elseif oder else beendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;if&amp;#039;&amp;#039;&amp;#039; (Bedingung) &amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisung)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;elseif&amp;#039;&amp;#039;&amp;#039; (Bedingung) &amp;#039;&amp;#039;&amp;#039;...&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anweisungen wie a = 2 können mit einem Semikolon angeschlossen werden,&amp;lt;br/&amp;gt;wie es in anderen Programmiersprachen üblich ist: a = 2;&lt;br /&gt;
&lt;br /&gt;
=== Wenn-Kontrollstrukturen ===&lt;br /&gt;
Im vorigen Abschnitt wurden logische Operatoren genannt – diese sind Bestandteil der Kontrollstrukturen und Schleifen.&amp;lt;br/&amp;gt;Unter Kontrollstrukturen kann man sich einfache Wenn-Verzweigungen vorstellen.&amp;lt;br/&amp;gt;Schleifen werden hingegen solange ausgeführt, wie die Bedingung zutrifft.&lt;br /&gt;
&lt;br /&gt;
Eine Verzweigung wird mit einer if-Bedingung realisiert:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;if&amp;#039;&amp;#039;&amp;#039; (Bedingung) &amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisungen)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;end&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Bedingungen werden mit Operatoren geprüft oder verknüpft. Die Vergleichsoperationen sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 ! Operator !! Bedeutung !! Beispiel&lt;br /&gt;
 |-&lt;br /&gt;
 | == || Gleichheitsoperator. Wahr wenn beide Werte gleich sind. || 5 == 5 --&amp;gt; Wahr&lt;br /&gt;
 |-&lt;br /&gt;
 | ~= || Ungleichheitsoperator. Wahr wenn beide Werte nicht gleich sind. || 5 ~= 5 --&amp;gt; Falsch&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;lt; || Kleiner-als-Operator. Wahr wenn der zu prüfende Wert kleiner ist als der andere. || 4 &amp;lt; 5 --&amp;gt; Wahr&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;lt;= || Kleiner-als-oder-gleich-Operator. Wahr wenn der zu prüfende Wert kleiner oder gleich dem anderen ist. || 5 &amp;lt;= 5 --&amp;gt; Wahr&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;gt; || Größer-als-Operator. Wahr wenn der zu prüfende Wert größer ist als der andere. || 6 &amp;gt; 5 --&amp;gt; Wahr&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;gt;= || Größer-als-oder-gleich-Operator. Wahr wenn der zu prüfende Wert größer oder gleich dem Anderen ist. || 5 &amp;gt;= 5 --&amp;gt; Wahr&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Vergleichsoperationen können verknüpft werden. Dazu dienen folgende Vergleichsoperationen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 ! Operator !! Bedeutung !! Beispiel&lt;br /&gt;
 |- &lt;br /&gt;
 | and || Und-Operator. Gibt wahr zurück, wenn beide Operanden wahr sind. || true and true --&amp;gt; Wahr&amp;lt;br/&amp;gt;true and false --&amp;gt; Falsch&lt;br /&gt;
 |- &lt;br /&gt;
 | or || Oder-Operator. Gibt wahr zurück, wenn ein Operand wahr ist. || false or false --&amp;gt; Falsch&amp;lt;br/&amp;gt;true or false --&amp;gt; Wahr&lt;br /&gt;
 |- &lt;br /&gt;
 | not || Wahrheits-Negations-Operator. Mach ein Wahr zu Falsch und ein Falsch zu wahr. || not true wird zu false&amp;lt;br/&amp;gt;not false wird zu true&lt;br /&gt;
 |}&lt;br /&gt;
Zusatzbemerkung: not ist vorrangig zu den arithmetischen Operatoren.&amp;lt;br/&amp;gt;Logikoperationen zu Vergleichsoperationen.&amp;lt;br/&amp;gt;Arithmetische Operationen vorrangig zu Logikoperationen.&amp;lt;br/&amp;gt;Zu Wahrheitswerten ist kein Vergleichsoperator notwendig – er wird immer gegen true geprüft.&lt;br /&gt;
&lt;br /&gt;
Oftmals ist es notwendig, weitere Fall-Abzweige zu programmieren.&amp;lt;br/&amp;gt;Vom Prinzip: wenn das… oder wenn das… oder das. Dies wird wird else-if-Kontrollstrukturen realisiert.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau dieser Kontrollstrukturen ist der Folgende:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;if&amp;#039;&amp;#039;&amp;#039; (Bedingung) &amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisungsblock den Fall)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;else&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisungsblock für unbehandelte Fälle)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;end&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;if&amp;#039;&amp;#039;&amp;#039; (Bedingung A) &amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisungsblock für Fall A)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;elseif&amp;#039;&amp;#039;&amp;#039; (Bedingung B) &amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisungsblock für Fall B)&amp;lt;br/&amp;gt;&lt;br /&gt;
(&amp;#039;&amp;#039;optional&amp;#039;&amp;#039;:	&amp;#039;&amp;#039;&amp;#039;else&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
			(Anweisungsblock für unbehandelte Fälle))&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;end&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um das ganze System zu verdeutlichen, dienen folgende Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_06_Vergleiche.png|473px]]&lt;br /&gt;
&lt;br /&gt;
=== Schleifen ===&lt;br /&gt;
Schleifen dienen zur Wiederholung einer Anweisung, solange eine bestimmte Bedingung gültig ist.&lt;br /&gt;
&lt;br /&gt;
Die einfachste Schleife ihrer Art ist die while-Schleife. Solange die Bedingung gültig ist,&amp;lt;br/&amp;gt;wird deren Anweisung im then-end-Block ausgeführt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;while&amp;#039;&amp;#039;&amp;#039; (Bedingung) &amp;#039;&amp;#039;&amp;#039;do&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisung)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;end&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Folgende Beispiel lässt den Wert c solange herunterzählen, bis c Null ist:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_07_While-Schleife.png|402px]]&lt;br /&gt;
&lt;br /&gt;
Dekrementieren = Zahl um 1 verringern. Inkrementieren = Zahl um 1 erhöhen.&lt;br /&gt;
&lt;br /&gt;
Manchmal ist es Notwendig, dass der Anweisungsblock vor der Bedingungsprüfung notwendig ist.&amp;lt;br/&amp;gt;Dazu dienen repeat-until-Schleifen – auch bekannt als do-while-Schleife.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;repeat&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisungen)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;until&amp;#039;&amp;#039;&amp;#039; (Bedingung)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_09_Repeat-Until-Schleife.png|310px]]&lt;br /&gt;
&lt;br /&gt;
Eine weitere interessante Schleife ist die numerische for-Schleife.&amp;lt;br/&amp;gt;In ihr ist die Deklaration, Zielwert und Schrittweite definiert. &amp;lt;br/&amp;gt;Folgende Form ist dabei zu beachten:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;for&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(Deklaration)&amp;#039;&amp;#039;, &amp;#039;&amp;#039;(Zielwert)&amp;#039;&amp;#039;(optional:, &amp;#039;&amp;#039;(Schrittweite)&amp;#039;&amp;#039;) &amp;#039;&amp;#039;&amp;#039;do&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
(Anweisung)&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;end&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist die Schrittweite nicht definiert (weil optional), wird 1 als Standardwert verwendet.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel berechnet c von 0 bis 10 als Folge:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_08_For-Schleife.png|501px]}&lt;br /&gt;
&lt;br /&gt;
== Funktionen ==&lt;br /&gt;
&lt;br /&gt;
Funktionen werden wie folgt aufgerufen:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;Funktionsname&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;(&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Argument&amp;#039;&amp;#039;, &amp;#039;&amp;#039;Argument&amp;#039;&amp;#039;, &amp;#039;&amp;#039;...&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;)&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;SendSignalMessage(PZB_500, ““, 1, 1, linkIndex)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Möchte man eigene Funktionen programmieren, verwendet man folgende Form:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;function&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Funktionsname&amp;#039;&amp;#039;(&amp;#039;&amp;#039;Parameter&amp;#039;&amp;#039;, &amp;#039;&amp;#039;Parameter&amp;#039;&amp;#039;, &amp;#039;&amp;#039;...&amp;#039;&amp;#039;)&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisungen)&amp;lt;br/&amp;gt;&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es sei noch zu erwähnen, dass man an Funktionen Argumente (Werte) übergibt und bei der Definition Parameter definiert.&amp;lt;br/&amp;gt;Folglich nennt man die übergebenen Argumente innerhalb einer Funktion Argument.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel zeigt die Deklaration der Funktion DebugMessage() und deren Aufruf.&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_10_Funktionen.png|604px]]&lt;br /&gt;
&lt;br /&gt;
Möchte man Rückgabewerte zurückgeben, wird dies mit dem Schlüsselwort &amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;return&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt; eingeleitet.&amp;lt;br/&amp;gt;In Lua ist es möglich mehrere Rückgabewerte zurückzuliefern.&amp;lt;br/&amp;gt;Das folgende Beispiel zeigt, wie das geht:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_11_Rückgabewerte.png|605px]]&lt;br /&gt;
&lt;br /&gt;
== Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Fast geschafft. Im letzten „Lernkapitel“ werden Tabellen behandelt. Tabellen werden auch als Arrays bezeichnet.&amp;lt;br/&amp;gt;Sie beinhalten Daten in Form von Schlüssel-Wert-Paaren.&lt;br /&gt;
&lt;br /&gt;
Eine Tabelle wird wie folgend deklariert:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Variable = &amp;#039;&amp;#039;&amp;#039;{}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist ebenfalls möglich, zur Deklaration Werte in Tabellen schreiben:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Variable = &amp;#039;&amp;#039;&amp;#039;{&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;VariablenName&amp;#039;&amp;#039; = &amp;#039;&amp;#039;Wert&amp;#039;&amp;#039;, &amp;#039;&amp;#039;...&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Zugriff ist vielseitig. Entweder greift man über eckige Klammern auf ein Schlüssel-Wert-Paar zu.&amp;lt;br/&amp;gt;Der Zugriff funktioniert auch über ein Tabelle-Punkt-Variablenname-System:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_12_Tabellen.png|538px]]&lt;br /&gt;
&lt;br /&gt;
Eine weitere Schleifenart ist die generische for-Schleife. Sie wird für Tabellen benutzt.&amp;lt;br/&amp;gt;Um sie zu realisieren benutzt man die Funktion &amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;inpairs(Tabelle)&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;. Das folgende Beispiel zeigt die Syntax:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_13_For-Generisch.png|377px]]&lt;br /&gt;
&lt;br /&gt;
== Ein paar Hinweise ==&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel gab einen Einblick in Lua und hat Grundlagen der Sprache vorgestellt.&amp;lt;br/&amp;gt;Nun beherrscht man die Sprache Lua im Allgemeinen.&lt;br /&gt;
&lt;br /&gt;
Doch was würde man ohne die Standardbibliotheken machen? Es gibt vorgefertigte Funktionen,&amp;lt;br/&amp;gt;zum Beispiel eine Mathematikbibliothek.&lt;br /&gt;
&lt;br /&gt;
Zudem wurde noch nicht auf Besonderheiten bezüglich RailWorks eingegangen.&lt;br /&gt;
&lt;br /&gt;
Dies folgt in den Artikeln:&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Das Lua-Tutorial - 2 Tipps und Bibliotheken|Das Lua-Tutorial: #2 – Die Lua-Bibliotheken]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Das Lua-Tutorial - 3 RailWorks: Besonderheiten und Funktionsübersucht|Das Lua-Tutorial: #3 – Besonderheiten und Funktionsübersucht]]&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Das_Lua-Tutorial_-_1_Grundlagen&amp;diff=644</id>
		<title>Das Lua-Tutorial - 1 Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Das_Lua-Tutorial_-_1_Grundlagen&amp;diff=644"/>
				<updated>2011-09-18T21:51:41Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: Stellt die Sprache Lua vor und ganz kurz die IDE.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Scriptsprache Lua]]&lt;br /&gt;
&lt;br /&gt;
= Das Lua-Tutorial - 1 Grundlagen =&lt;br /&gt;
&lt;br /&gt;
Diese Artikelserie zeigt, wie man mit Lua eigene Funktionen in das Programm einbinden kann. „#1 – Grundlagen“ erklärt das Fundament von Lua und wie man damit arbeitet. Es ist spezifisch für RailWorks ausgelegt.&lt;br /&gt;
&lt;br /&gt;
== Was ist Lua und was benötige ich? ==&lt;br /&gt;
&lt;br /&gt;
Lua ist eine Formsprache, mit der man ein Programm von außen steuern kann. Was heißt „außen“ und wie ist das gemeint?&lt;br /&gt;
&lt;br /&gt;
Ein Programm besitzt einen inneren Kern, der immer gleich abläuft – er ist fest verankert und damit von „innen“ gesteuert.&lt;br /&gt;
Wir können ihn mit normalen Mitteln nicht verändern. Lässt ein Programm zu, dass es veränderbar ist,&lt;br /&gt;
dann lässt es eine Steuerung von außen zu. Das kann mit einer Konfigurationsdatei („Bildschirmauflösung einstellen“)&lt;br /&gt;
oder einem Script gelöst sein. Das Script sagt was der Kern erledigen soll.&lt;br /&gt;
Und diese Scripte werden zum Beispiel mit Lua geschrieben – darum geht es hier.&lt;br /&gt;
&lt;br /&gt;
Um solche Scripte zu schreiben, muss man einer Formsprache exakt folgen. Das ist wie Tangotanzen auf der Showbühne: Nur das unser Tanzpartner die Tastatur ist. Die Formsprache beschreibt uns die Regeln, wie etwas zu formulieren ist, welche Möglichkeiten gegeben sind und was dadurch ausgelöst wird.&lt;br /&gt;
&lt;br /&gt;
Natürlich passiert es schnell, dass mal nicht alles glatt läuft. Und zum Glück gibt es Programme, die uns unterstützen, Fehler durch korrekten Text zu ersetzen. Diesen Text den wir schreiben, nennt man Quellcode.&lt;br /&gt;
&lt;br /&gt;
Ein Programm, das ich sehr gerne nutze und empfehle, ist [http://luaforge.net/frs/?group_id=84&amp;amp;release_id=553 LuaEdit 3.03RC]. Es ist einfach organisiert und ermöglicht eine schnelle Überprüfung der Formsprache. So sieht das Programm aus, wenn man Scripte schreibt (siehe rechts).&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_01_LuaEdit_3.03RC.png|miniatur|Die Entwicklungsumgebung [http://luaforge.net/frs/?group_id=84&amp;amp;release_id=553 LuaEdit 3.03RC] ]]&lt;br /&gt;
Oben haben wir ein Menü. Es ermöglicht allgemeine Operationen, Sichteinstellungen, Projektverwaltung, einen Test durchzuführen und das starten von Tools.&lt;br /&gt;
&lt;br /&gt;
In der oberen Toolleiste finden wir in der ersten Gruppe Felder zum erzeugen neuer Dateien oder Projekte.&lt;br /&gt;
In der zweiten Gruppe können wir Dateien öffnen und speichern. In der dritten Gruppe können wir&lt;br /&gt;
Dateien zu Projekten zuordnen. Die vierte Gruppe ermöglicht das Drucken. Die fünfte Gruppe kann&lt;br /&gt;
den Testdurchlauf beeinflussen. Die sechste Gruppe ermöglicht das Prüfen der Syntax und&lt;br /&gt;
das Erstellen von kompilierten Scripten. Die siebente Gruppe ermöglicht das Suchen und&lt;br /&gt;
das Setzen von Haltepunkten im Script, wenn wir einen Testdurchlauf durchführen.&lt;br /&gt;
&lt;br /&gt;
Die untere Toolleiste vereinfacht das Bearbeiten von Text. Dazu zählt zum Beispiel&lt;br /&gt;
das automatische Ein- und Auskommentieren oder Verrücken von Text.&lt;br /&gt;
Am besten probiert man an einem Testtext, was der jeweiligen Schalter bewirkt :-).&lt;br /&gt;
&lt;br /&gt;
Ich habe bei der Beschreibung das Wort „Kompilieren“ in den Raum geworfen.&lt;br /&gt;
Das ganze muss man sich so vorstellen: Wir schreiben Text in lesbarer Form,&lt;br /&gt;
den wir verändern können. Kompilieren wir den Text, wird unser geschriebenes&lt;br /&gt;
interpretiert und mit programmeigenen Anweisungen übersetzt. Die programmeigenen&lt;br /&gt;
Anweisungen können wir natürlich nicht ohne weiteres frei bearbeiten.&lt;br /&gt;
Das ganze macht man, damit man Zeit spart, weil die Interpretation manchmal&lt;br /&gt;
ganz schön lange dauern kann, wenn man sehr viele Scriptdateien hat.&lt;br /&gt;
Aber damit müssen wir uns in RailWorks nicht herumärgern: Das macht RailWorks für uns, leider.&lt;br /&gt;
&lt;br /&gt;
== Kommentieren hilft ==&lt;br /&gt;
&lt;br /&gt;
Scripten ist eine Gemeinschaftsaufgabe. Schreiben wir Quellcode, müssen wir später verstehen,&lt;br /&gt;
was wir geschrieben haben. Und unseren Mitgliedern hilft es, Fehler schneller und leichter zu entlarven,&lt;br /&gt;
um sie auszumerzen. Ein Kommentar ist dabei etwas, was nicht vom Interpreter (dem „Leser“) beachtet wird.&lt;br /&gt;
&lt;br /&gt;
Er wird mit zwei arabischen Zahlstrichen angefangen (--) und gilt für die eine Zeile. Etwa so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;-- Kommentare sind für folgende Fälle gedacht:&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Hinweise am Anfang der Dateien&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** wer, was, wann und wie etwas geändert hat.&lt;br /&gt;
** Falls notwendig: Nenne&lt;br /&gt;
*** die verwendete Sprache&lt;br /&gt;
*** den Namen der Gruppe&lt;br /&gt;
*** oder die Lizenz (und/oder deren Bedingungen).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Eigenschaften der Funktionen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** Was sie machen sollen oder bewirken&lt;br /&gt;
** Wann sie verwendet werden dürfen&lt;br /&gt;
** Welche Parameter zulässig sind und was sie bedeuten – die Einheiten&lt;br /&gt;
** Rückgabewerte, wenn Sie vorhanden sind&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Beschreibung der Aufgabenfelder&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** was wie erledigt werden soll&lt;br /&gt;
** welche Werte warum besondere Rollen spielen.&lt;br /&gt;
&lt;br /&gt;
Es ist ein logischer Prozess und wird eine Menge Schreibarbeit verursachen.&amp;lt;br/&amp;gt;Aber das Tutorial ist so ausgelegt, dass die „Kommunikationsaufgabe Kommentieren“ als Routine ein leichtes Spiel wird.&lt;br /&gt;
&lt;br /&gt;
== Variablen und Werte ==&lt;br /&gt;
&lt;br /&gt;
Informationen müssen gespeichert werden: Dieser Aufgabe werden Variablen gerecht.&amp;lt;br/&amp;gt;Ihre Werte werden durch logische Berechnungsprozesse oder festgelegte Logik bestimmt.&lt;br /&gt;
&lt;br /&gt;
Damit man unterscheiden kann, was Werte beinhalten, unterteilt man diese in Dateitypen.&amp;lt;br/&amp;gt;Für uns wichtig kann sein:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 ! Datentyp !! Beschreibung !! Beispiel&lt;br /&gt;
 |-&lt;br /&gt;
 | string || Ein Text aus einer Verkettung von Zeichen. || „Hallo Welt“&lt;br /&gt;
 |-&lt;br /&gt;
 | number || Eine Zahl. Bei Gleitkommazahlen schreibt man mit Punkt statt mit Komma. &amp;lt;br/&amp;gt;Ein „f“ kann zusätzlich stehen und hat für uns keine Bedeutung. || 3, 5, 9&amp;lt;br/&amp;gt;2.6, 3.1415f&lt;br /&gt;
 |-&lt;br /&gt;
 | Boolean || Ein Wahrheitswert. Wahr oder Falsch. || Wert: true oder false&lt;br /&gt;
 |-&lt;br /&gt;
 | nil || Eine Variable, die keinen Wert hat: Datentyplos. || Wert: nil&lt;br /&gt;
 |-&lt;br /&gt;
 | table || Eine Tabelle: „Array“. || Definition: { }&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Der Datentyp wird zur Laufzeit gewählt und ist bei vielen Typen austauschbar.&amp;lt;br/&amp;gt;So kann ein string zum Beispiel zu einer Zahl umgewandelt werden, wenn dies möglich ist.&amp;lt;br/&amp;gt;Ein Wahrheitswert, eine Zahl oder auch nil kann zu einem Text umgewandelt werden.&lt;br /&gt;
&lt;br /&gt;
Die Definition einer Variable ist einfach – man schreibt sie in folgender Form auf:&lt;br /&gt;
&lt;br /&gt;
[Name] = [Wert]&lt;br /&gt;
&lt;br /&gt;
Dazu ein paar Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_02_Variablendefinitionen.png|rahmenlos|231px|Variablendefinitionen in Lua.]]&lt;br /&gt;
&lt;br /&gt;
Ganz links ist die Zeilennummer, Einzustellen in den Optionen von LuaEdit.&lt;br /&gt;
Die Namensgebung von Variablen entspricht den obigen Beispielen:&amp;lt;br/&amp;gt;Sie darf mit einem Buchstaben anfangen, der keine Nummer ist. Nach dem ersten Buchstaben darf man Nummern verwenden – das meidet man allerdings.&lt;br /&gt;
&lt;br /&gt;
== Operatoren ==&lt;br /&gt;
&lt;br /&gt;
Beim Programmieren unterscheidet man in drei Arten von Operationen:&lt;br /&gt;
* Arithmetische Operationen (Rechenoperationen)&lt;br /&gt;
* Relationale Operationen (Vergleichsoperationen) und&lt;br /&gt;
* Logische Operationen&lt;br /&gt;
&lt;br /&gt;
Jede Gruppe deckt bestimmte Aufgabenfelder ab. So dienen arithmetische Operationen&amp;lt;br/&amp;gt;der Berechnung von Werten und relationale und logische Operationen dem Vergleich von Werten.&lt;br /&gt;
&lt;br /&gt;
Dieser Abschnitt beschäftigt sich mit Rechenoperationen. Das sind die Operatoren&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;=&amp;quot; --&amp;gt; Zuweisungsoperator&lt;br /&gt;
* &amp;quot;+&amp;quot; --&amp;gt; Additionsoparator&lt;br /&gt;
* &amp;quot;-&amp;quot; --&amp;gt; Subtraktionsoperator oder auch Negationsoperator&lt;br /&gt;
* &amp;quot;*&amp;quot; --&amp;gt; Multiplikationsoperator&lt;br /&gt;
* &amp;quot;/&amp;quot; --&amp;gt; Divisionsoperator&lt;br /&gt;
* &amp;quot;..&amp;quot; --&amp;gt; Verknüpfungsoperator&lt;br /&gt;
&lt;br /&gt;
Um diese Funktion zu verdeutlichen, dienen folgende Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_03_ArOperationen.png|rahmenlos|534px|Operatorenbeispiele in Lua]]&lt;br /&gt;
&lt;br /&gt;
== Kontrollstrukturen und Schleifen ==&lt;br /&gt;
&lt;br /&gt;
=== Anweisungen und Rümpfe ===&lt;br /&gt;
&lt;br /&gt;
Jede Anweisung wird in einem Rumpf ausgeführt. Dabei unterscheidet man in&lt;br /&gt;
* Anweisungsrümpfe&lt;br /&gt;
* Branchrümpfe&lt;br /&gt;
* Branchrümpfe der If-Else-Kontrollstrukturen&lt;br /&gt;
&lt;br /&gt;
Branchrümpfe begrenzen einen Programmblock und benötigen eine Bedingung:&lt;br /&gt;
&amp;lt;code&amp;gt;(Bedingung) &amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisung)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;end&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie werden mit then eingeleitet und mit end beendet.&lt;br /&gt;
&lt;br /&gt;
Anweisungsrümpfe der If-Else-Kontrollstrukturen werden wie Anweisungsrümpfe definiert,&amp;lt;br/&amp;gt;können jedoch ohne das Schlüsselwort end beendet werden, wenn sie mit elseif oder else beendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;if&amp;#039;&amp;#039;&amp;#039; (Bedingung) &amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisung)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;elseif&amp;#039;&amp;#039;&amp;#039; (Bedingung) &amp;#039;&amp;#039;&amp;#039;...&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anweisungen wie a = 2 können mit einem Semikolon angeschlossen werden,&amp;lt;br/&amp;gt;wie es in anderen Programmiersprachen üblich ist: a = 2;&lt;br /&gt;
&lt;br /&gt;
=== Wenn-Kontrollstrukturen ===&lt;br /&gt;
Im vorigen Abschnitt wurden logische Operatoren genannt – diese sind Bestandteil der Kontrollstrukturen und Schleifen.&amp;lt;br/&amp;gt;Unter Kontrollstrukturen kann man sich einfache Wenn-Verzweigungen vorstellen.&amp;lt;br/&amp;gt;Schleifen werden hingegen solange ausgeführt, wie die Bedingung zutrifft.&lt;br /&gt;
&lt;br /&gt;
Eine Verzweigung wird mit einer if-Bedingung realisiert:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;if&amp;#039;&amp;#039;&amp;#039; (Bedingung) &amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisungen)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;end&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Bedingungen werden mit Operatoren geprüft oder verknüpft. Die Vergleichsoperationen sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 ! Operator !! Bedeutung !! Beispiel&lt;br /&gt;
 |-&lt;br /&gt;
 | == || Gleichheitsoperator. Wahr wenn beide Werte gleich sind. || 5 == 5 --&amp;gt; Wahr&lt;br /&gt;
 |-&lt;br /&gt;
 | ~= || Ungleichheitsoperator. Wahr wenn beide Werte nicht gleich sind. || 5 ~= 5 --&amp;gt; Falsch&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;lt; || Kleiner-als-Operator. Wahr wenn der zu prüfende Wert kleiner ist als der andere. || 4 &amp;lt; 5 --&amp;gt; Wahr&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;lt;= || Kleiner-als-oder-gleich-Operator. Wahr wenn der zu prüfende Wert kleiner oder gleich dem anderen ist. || 5 &amp;lt;= 5 --&amp;gt; Wahr&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;gt; || Größer-als-Operator. Wahr wenn der zu prüfende Wert größer ist als der andere. || 6 &amp;gt; 5 --&amp;gt; Wahr&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;gt;= || Größer-als-oder-gleich-Operator. Wahr wenn der zu prüfende Wert größer oder gleich dem Anderen ist. || 5 &amp;gt;= 5 --&amp;gt; Wahr&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Vergleichsoperationen können verknüpft werden. Dazu dienen folgende Vergleichsoperationen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 ! Operator !! Bedeutung !! Beispiel&lt;br /&gt;
 |- &lt;br /&gt;
 | and || Und-Operator. Gibt wahr zurück, wenn beide Operanden wahr sind. || true and true --&amp;gt; Wahr&amp;lt;br/&amp;gt;true and false --&amp;gt; Falsch&lt;br /&gt;
 |- &lt;br /&gt;
 | or || Oder-Operator. Gibt wahr zurück, wenn ein Operand wahr ist. || false or false --&amp;gt; Falsch&amp;lt;br/&amp;gt;true or false --&amp;gt; Wahr&lt;br /&gt;
 |- &lt;br /&gt;
 | not || Wahrheits-Negations-Operator. Mach ein Wahr zu Falsch und ein Falsch zu wahr. || not true wird zu false&amp;lt;br/&amp;gt;not false wird zu true&lt;br /&gt;
 |}&lt;br /&gt;
Zusatzbemerkung: not ist vorrangig zu den arithmetischen Operatoren.&amp;lt;br/&amp;gt;Logikoperationen zu Vergleichsoperationen.&amp;lt;br/&amp;gt;Arithmetische Operationen vorrangig zu Logikoperationen.&amp;lt;br/&amp;gt;Zu Wahrheitswerten ist kein Vergleichsoperator notwendig – er wird immer gegen true geprüft.&lt;br /&gt;
&lt;br /&gt;
Oftmals ist es notwendig, weitere Fall-Abzweige zu programmieren.&amp;lt;br/&amp;gt;Vom Prinzip: wenn das… oder wenn das… oder das. Dies wird wird else-if-Kontrollstrukturen realisiert.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau dieser Kontrollstrukturen ist der Folgende:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;if&amp;#039;&amp;#039;&amp;#039; (Bedingung) &amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisungsblock den Fall)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;else&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisungsblock für unbehandelte Fälle)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;end&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;if&amp;#039;&amp;#039;&amp;#039; (Bedingung A) &amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisungsblock für Fall A)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;elseif&amp;#039;&amp;#039;&amp;#039; (Bedingung B) &amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisungsblock für Fall B)&amp;lt;br/&amp;gt;&lt;br /&gt;
(&amp;#039;&amp;#039;optional&amp;#039;&amp;#039;:	&amp;#039;&amp;#039;&amp;#039;else&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
			(Anweisungsblock für unbehandelte Fälle))&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;end&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um das ganze System zu verdeutlichen, dienen folgende Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_06_Vergleiche.png|473px]]&lt;br /&gt;
&lt;br /&gt;
=== Schleifen ===&lt;br /&gt;
Schleifen dienen zur Wiederholung einer Anweisung, solange eine bestimmte Bedingung gültig ist.&lt;br /&gt;
&lt;br /&gt;
Die einfachste Schleife ihrer Art ist die while-Schleife. Solange die Bedingung gültig ist,&amp;lt;br/&amp;gt;wird deren Anweisung im then-end-Block ausgeführt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;while&amp;#039;&amp;#039;&amp;#039; (Bedingung) &amp;#039;&amp;#039;&amp;#039;do&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisung)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;end&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Folgende Beispiel lässt den Wert c solange herunterzählen, bis c Null ist:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_07_While-Schleife.png|402px]]&lt;br /&gt;
&lt;br /&gt;
Dekrementieren = Zahl um 1 verringern. Inkrementieren = Zahl um 1 erhöhen.&lt;br /&gt;
&lt;br /&gt;
Manchmal ist es Notwendig, dass der Anweisungsblock vor der Bedingungsprüfung notwendig ist.&amp;lt;br/&amp;gt;Dazu dienen repeat-until-Schleifen – auch bekannt als do-while-Schleife.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;repeat&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisungen)&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;until&amp;#039;&amp;#039;&amp;#039; (Bedingung)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_09_Repeat-Until-Schleife.png|310px]]&lt;br /&gt;
&lt;br /&gt;
Eine weitere interessante Schleife ist die numerische for-Schleife.&amp;lt;br/&amp;gt;In ihr ist die Deklaration, Zielwert und Schrittweite definiert. &amp;lt;br/&amp;gt;Folgende Form ist dabei zu beachten:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;for&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(Deklaration)&amp;#039;&amp;#039;, &amp;#039;&amp;#039;(Zielwert)&amp;#039;&amp;#039;(optional:, &amp;#039;&amp;#039;(Schrittweite)&amp;#039;&amp;#039;) &amp;#039;&amp;#039;&amp;#039;do&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
(Anweisung)&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;end&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist die Schrittweite nicht definiert (weil optional), wird 1 als Standardwert verwendet.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel berechnet c von 0 bis 10 als Folge:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_08_For-Schleife.png|501px]&lt;br /&gt;
&lt;br /&gt;
== Funktionen ==&lt;br /&gt;
&lt;br /&gt;
Funktionen werden wie folgt aufgerufen:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;Funktionsname&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;(&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Argument&amp;#039;&amp;#039;, &amp;#039;&amp;#039;Argument&amp;#039;&amp;#039;, &amp;#039;&amp;#039;...&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;)&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;SendSignalMessage(PZB_500, ““, 1, 1, linkIndex)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Möchte man eigene Funktionen programmieren, verwendet man folgende Form:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;function&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Funktionsname&amp;#039;&amp;#039;(&amp;#039;&amp;#039;Parameter&amp;#039;&amp;#039;, &amp;#039;&amp;#039;Parameter&amp;#039;&amp;#039;, &amp;#039;&amp;#039;...&amp;#039;&amp;#039;)&amp;lt;br/&amp;gt;&lt;br /&gt;
	(Anweisungen)&amp;lt;br/&amp;gt;&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es sei noch zu erwähnen, dass man an Funktionen Argumente (Werte) übergibt und bei der Definition Parameter definiert.&amp;lt;br/&amp;gt;Folglich nennt man die übergebenen Argumente innerhalb einer Funktion Argument.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel zeigt die Deklaration der Funktion DebugMessage() und deren Aufruf.&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_10_Funktionen.png|604px]]&lt;br /&gt;
&lt;br /&gt;
Möchte man Rückgabewerte zurückgeben, wird dies mit dem Schlüsselwort &amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;return&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt; eingeleitet.&amp;lt;br/&amp;gt;In Lua ist es möglich mehrere Rückgabewerte zurückzuliefern.&amp;lt;br/&amp;gt;Das folgende Beispiel zeigt, wie das geht:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_11_Rückgabewerte.png|605px]]&lt;br /&gt;
&lt;br /&gt;
== Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Fast geschafft. Im letzten „Lernkapitel“ werden Tabellen behandelt. Tabellen werden auch als Arrays bezeichnet.&amp;lt;br/&amp;gt;Sie beinhalten Daten in Form von Schlüssel-Wert-Paaren.&lt;br /&gt;
&lt;br /&gt;
Eine Tabelle wird wie folgend deklariert:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Variable = &amp;#039;&amp;#039;&amp;#039;{}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist ebenfalls möglich, zur Deklaration Werte in Tabellen schreiben:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Variable = &amp;#039;&amp;#039;&amp;#039;{&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;VariablenName&amp;#039;&amp;#039; = &amp;#039;&amp;#039;Wert&amp;#039;&amp;#039;, &amp;#039;&amp;#039;...&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Zugriff ist vielseitig. Entweder greift man über eckige Klammern auf ein Schlüssel-Wert-Paar zu.&amp;lt;br/&amp;gt;Der Zugriff funktioniert auch über ein Tabelle-Punkt-Variablenname-System:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_12_Tabellen.png|538px]]&lt;br /&gt;
&lt;br /&gt;
Eine weitere Schleifenart ist die generische for-Schleife. Sie wird für Tabellen benutzt.&amp;lt;br/&amp;gt;Um sie zu realisieren benutzt man die Funktion &amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;inpairs(Tabelle)&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;. Das folgende Beispiel zeigt die Syntax:&lt;br /&gt;
&lt;br /&gt;
[[Datei:PP_LUATUT01_13_For-Generisch.png|377px]]&lt;br /&gt;
&lt;br /&gt;
== Ein paar Hinweise ==&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel gab einen Einblick in Lua und hat Grundlagen der Sprache vorgestellt.&amp;lt;br/&amp;gt;Nun beherrscht man die Sprache Lua im Allgemeinen.&lt;br /&gt;
&lt;br /&gt;
Doch was würde man ohne die Standardbibliotheken machen? Es gibt vorgefertigte Funktionen,&amp;lt;br/&amp;gt;zum Beispiel eine Mathematikbibliothek.&lt;br /&gt;
&lt;br /&gt;
Zudem wurde noch nicht auf Besonderheiten bezüglich RailWorks eingegangen.&lt;br /&gt;
&lt;br /&gt;
Dies folgt in den Artikeln:&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Das Lua-Tutorial - 2 Tipps und Bibliotheken|Das Lua-Tutorial: #2 – Die Lua-Bibliotheken]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Das Lua-Tutorial - 3 RailWorks: Besonderheiten und Funktionsübersucht|Das Lua-Tutorial: #3 – Besonderheiten und Funktionsübersucht]]&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Kategorie:Scriptsprache_Lua&amp;diff=643</id>
		<title>Kategorie:Scriptsprache Lua</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Kategorie:Scriptsprache_Lua&amp;diff=643"/>
				<updated>2011-09-18T20:37:04Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: Das ist die Kategorieseite für die Lua-Tutorials.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT01_13_For-Generisch.png&amp;diff=642</id>
		<title>Datei:PP LUATUT01 13 For-Generisch.png</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT01_13_For-Generisch.png&amp;diff=642"/>
				<updated>2011-09-18T20:33:12Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: Generische For-Schleife in Lua.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Generische For-Schleife in Lua.&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT01_12_Tabellen.png&amp;diff=641</id>
		<title>Datei:PP LUATUT01 12 Tabellen.png</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT01_12_Tabellen.png&amp;diff=641"/>
				<updated>2011-09-18T20:32:44Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: Lua Tabellen.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Lua Tabellen.&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT01_11_R%C3%BCckgabewerte.png&amp;diff=640</id>
		<title>Datei:PP LUATUT01 11 Rückgabewerte.png</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT01_11_R%C3%BCckgabewerte.png&amp;diff=640"/>
				<updated>2011-09-18T20:32:26Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: Return values in Lua.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Return values in Lua.&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT01_10_Funktionen.png&amp;diff=639</id>
		<title>Datei:PP LUATUT01 10 Funktionen.png</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT01_10_Funktionen.png&amp;diff=639"/>
				<updated>2011-09-18T20:32:00Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: Lua Funktionen.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Lua Funktionen.&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT01_09_Repeat-Until-Schleife.png&amp;diff=638</id>
		<title>Datei:PP LUATUT01 09 Repeat-Until-Schleife.png</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT01_09_Repeat-Until-Schleife.png&amp;diff=638"/>
				<updated>2011-09-18T20:31:35Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: Die repeat-until-Schleife in Lua.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die repeat-until-Schleife in Lua.&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT01_08_For-Schleife.png&amp;diff=637</id>
		<title>Datei:PP LUATUT01 08 For-Schleife.png</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT01_08_For-Schleife.png&amp;diff=637"/>
				<updated>2011-09-18T20:31:02Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: Die for-Schleife in Lua.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die for-Schleife in Lua.&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT01_07_While-Schleife.png&amp;diff=636</id>
		<title>Datei:PP LUATUT01 07 While-Schleife.png</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT01_07_While-Schleife.png&amp;diff=636"/>
				<updated>2011-09-18T20:30:38Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: Die while-Schleife in Lua.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die while-Schleife in Lua.&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT01_06_Vergleiche.png&amp;diff=635</id>
		<title>Datei:PP LUATUT01 06 Vergleiche.png</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT01_06_Vergleiche.png&amp;diff=635"/>
				<updated>2011-09-18T20:30:14Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: If-Else-Branches in Lua.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If-Else-Branches in Lua.&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT01_03_ArOperationen.png&amp;diff=634</id>
		<title>Datei:PP LUATUT01 03 ArOperationen.png</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT01_03_ArOperationen.png&amp;diff=634"/>
				<updated>2011-09-18T20:29:10Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: Arithmetische Operationen in Lua.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Arithmetische Operationen in Lua.&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT01_02_Variablendefinitionen.png&amp;diff=633</id>
		<title>Datei:PP LUATUT01 02 Variablendefinitionen.png</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT01_02_Variablendefinitionen.png&amp;diff=633"/>
				<updated>2011-09-18T20:28:35Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: Definition von Variablen in Lua.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Definition von Variablen in Lua.&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	<entry>
		<id>https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT01_01_LuaEdit_3.03RC.png&amp;diff=632</id>
		<title>Datei:PP LUATUT01 01 LuaEdit 3.03RC.png</title>
		<link rel="alternate" type="text/html" href="https://www.rail-sim.de/wiki/index.php?title=Datei:PP_LUATUT01_01_LuaEdit_3.03RC.png&amp;diff=632"/>
				<updated>2011-09-18T20:27:23Z</updated>
		
		<summary type="html">&lt;p&gt;Patrick: Das Programm LuaEdit 3.03RC&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Programm LuaEdit 3.03RC&lt;/div&gt;</summary>
		<author><name>Patrick</name></author>	</entry>

	</feed>