Welche Funktion muss vor und welche muss hinter der EEPMain() stehen?
Jede Funktionsdefinition muss vor ihrem Funktionsaufruf stehen.
Und damit ist schon alles erklärt.
Ich will es trotzdem ein wenig ausführlicher erklären. Weil da offenbar Mythen kursieren.
Ob irgendeine Funktionsdefinition vor der Definition der Funktion EEPMain() steht oder dahinter, ist völlig egal!
Denn die Funktion EEPMain() wird von EEP erst dann das erste Mal aufgerufen, wenn das komplette Skript abgearbeitet ist. Ganz egal, wo sie im Skript definiert wurde. Wenn die EEPMain() aufgerufen wird, sind also alle Funktionen im Skript definiert und stehen zur Verfügung. Dasselbe gilt für sämtliche Funktionen, die per Kontaktpunkt aufgerufen werden. Die dürfen ebenfalls an beliebiger Stelle im Skript stehen. Weil die ganze Anlage erst losläuft, nachdem das komplette Skript abgearbeitet wurde. Vorher kann kein Zug über einen KP fahren und eine Funktion auslösen.
Macht euch das bitte immer wieder klar:
Das Schlüsselwort function heißt so etwas wie merk dir diese Schritte
Es leitet eine Funktionsdefinition ein. Der Computer wird nur aufgefordert, sich die folgenden Befehlsschritte unter einem Namen zu merken. Mehr nicht! An dieser Stelle wird nichts ausgeführt. Das Skript erstellt sozusagen ein Arbeitsbuch. Und dieses Buch wird nicht sortiert.
Ein Funktionsaufruf bedeutet dann nichts anderes als "Mach jetzt das, was in deinem Buch unter diesem Funktionsnamen steht!". Und dafür ist es völlig egal, an welcher Stelle es im Buch steht. Deshalb haben Funktionen einen Namen. Damit der Computer anhand des Namens die Befehlsliste findet, die er ausführen soll.
function Beispiel() -- merk dir, was du tun sollst wenn ich es dir sage
print("Hallo EEP") -- nicht jetzt, sondern beim Aufruf der Funktion
end
Beispiel() -- tu es jetzt!
Wird der folgende Code funktionieren?
function EEPMain()
Beispiel()
return 1
end
function Beispiel()
Zahl = Zahl + 1
print(Zahl)
end
Zahl = 0
Alles anzeigen
Ja, selbstverständlich funktioniert der.
In der EEPMain() steht zwar der Funktionsaufruf Beispiel(). Und damit steht er in der Zeile 2. Also im Skript über der Zeile 6, in der die Definition der Funktion Beispiel() beginnt.
Aber der Aufruf findet erst dann statt, wenn die EEPMain() ausgeführt wird. Also nach der Definition der Funktion Beispiel(). Egal, ob die Definition der Funktion Beispiel() im Skript vor oder hinter der Definition der EEPMain() steht.
Und in der Funktion Beispiel() wird eine Variable mit Namen Zahl hochgezählt, die erst weiter unten im Skript deklariert wird. Das funktioniert deshalb, weil das Hochzählen erst dann stattfindet, wenn die Funktion Beispiel() ausgeführt wird. Für die Ausführung muss die Variable zwingend deklariert sein. Aber eben erst dann. Und ausgeführt wird Beispiel() erst, nachdem das komplette Skript schon abgearbeitet wurde.
Nebenbemerkung: Es ist kein guter Stil, eine Variable in eine Funktion einzusetzen bevor sie deklariert wurde. Und in anderen Programmiersprachen wird sofort gemeckert, wenn man das tut. Aber nur deshalb, weil das Risiko viel zu groß ist, dass man die Deklaration ganz vergisst.
Schlusswort:
Die Aussage, dass es Funktionsdefinitionen gäbe, die vor der EEPMain() stehen müssten und solche, die dahinter gehören, ist blühender Unsinn, der in mondfinsterer Nacht zusammengebraut wurde.