Re: Basis Script zum anpassen
Posted: Sun 26. Jul 2009, 13:29
Hallo Seppy,
vielen Dank für das Skript, das schaue ich mir gerne einmal an, vielleicht kann ich ja hier und da noch was tunen.
Bei 'SleepExec' gibt es die folgenden Varianten ('Überladungen'):
Diese Funktion bekommt keine Parameter übergeben und gibt auch nichts zurück. Sie wartet auf das Beenden von Teach oder Think, egal wie lange das dauert. Das Skript steckt also in der Funktion fest, solange Teach oder Think aktiv ist, und wenn es Tage oder Wochen dauern sollte.
('void' kannst Du als 'nichts' übersetzen. In der Ursprache 'C' musste man dementsprechend das 'void' auch anstatt der leeren Klammern scheiben (also 'void SleepExec(void)' ). Das spart man sich inzwischen und in AngelScript ist es gar nicht mehr gültig, soweit ich weiß, eine leere Parameterliste wird also immer mit leeren Klammern angegeben.)
Diese Überladung ('Variante') bekommt einen Parameter vom Typ 'uint' übergeben, der angibt, wie lange die Funktion maximal auf das Beenden des Think bzw. Teach warten soll, bevor sie auf jeden Fall zurückkehrt. Den Parameter-Namen 'maxTimeMs' kannst Du ignorieren, er ist nicht wichtig und Du musst ihn auch nicht in Deinem Code verwenden. Er ist nur von mir so gewählt worden, dass er möglichst gut ausdrückt, was die Funktion mit diesem Parameter macht. Der Rückgabewert vom Typ 'bool' (also entweder der Wert 'true' oder der Wert 'false') gibt an, warum die Funktion zurückgekehrt ist: 'true' bedeutet, dass Teach oder Think geendet hat, 'false' bedeutet, dass die Funktion zurückgekehrt ist, weil der angegebene Timeout-Wert (Parameter 'maxTimeMs') abgelaufen ist, ohne das Teach oder Think geendet hat.
Dementsprechend:
Ruft die Funktionsüberladung 'void SleepExec()' auf, kehrt also erst zurück, wenn Teach oder Think beendet ist.
Ruft die Überladung 'bool SleepExec(uint maxTimeMs)' auf, wobei für 'maxTimeMs' der Wert 6000 übergeben wird. Die Funktion kehrt also zurück, wenn entweder Think oder Sleep endet, spätestens aber nach 6000 ms. Der Rückgabewert wird hier ignoriert.
Im folgenden Beispiel wird ebenfalls die Überladung 'bool SleepExec(uint maxTimeMs)' aufgerufen, hier wird der Rückgabewert aber verwendet, um eine Fallunterscheidung durchzuführen:
gleichwertig ist der folgende Code, dabei sieht man die Rückgabevariable nur deutlicher:
Viele Funktionen von MemBrain sind mit mehreren Varianten überladen. Z.B. die 'SelectInput(...)' Funktion, hier gibt es mehrere Varianten, je nachdem, wie viele Input-Neuronen und welche man selektieren möchte. Auch im Sktipt selbst kann man Funktionsüberladungen programmieren. Ein Beispiel hierfür ist die Methode 'Start' der Klasse 'SecondsTimer', die ich jüngst mit einer weiteren Variante überladen habe. Es gibt hier die beiden Überladungen:
Je nachdem, ob Du beim Aufruf von 'Start' etwas übergibst oder nicht, sucht sich der Skriptcompiler die richtige Überladung heraus. Den Code für die beiden Varianten kannst Du Dir in der Datei 'SecondsTimer.as' anschauen, wenn Du magst. Ist nichts kompliziertes dran, die Funktion wird einfach noch einmal definiert, mit anderer Parameterliste und anderem Inhalt.
Klärt das Deine Fragen win wenig? Ich weiß, Programierung ist am Anfang etwas mühsam und verwirred, wenn ich mir Deine letzten Skripte aber so anschaue, machst Du beachtlich schnell Fortschritte! Vor allem sehe ich, dass Du schon den wichtigsten Aspekt überhaupt erfasst hast: 'Teile und herrsche!'. Immer alles schön in Unterfunktionen oder sogar neue Skriptdateien auslagern, dann wächst einem ein Programm auch nicht über den Kopf, nur so bleibt die Komplexität beherrschbar!
Viele Grüße,
Thomas
vielen Dank für das Skript, das schaue ich mir gerne einmal an, vielleicht kann ich ja hier und da noch was tunen.
Da muss ich mir erst das Skript anschauen...Seppy wrote:Fragen:
Wo füge ich den Sleep(100) am besten ein (Anfang oder Ende der Schleife)?
Bei 'SleepExec' handelt es sich um eine sogenannte 'überladene' Funktion. Das bedeutet nichts anderes, als dass es mehrere Versionen dieser Funktion gibt, die alle gleich heißen (nämlich 'SleepExec'), sich aber bzgl. der übergebenen und zurückgegebenen Parameter unterscheiden.Seppy wrote:Wie werden Befehle wie z.B. "bool SleepExec(uint maxTimeMs)" verwendet ?
Der SleepExec() sieht ja so aus:
SleepExec();
Wie ist das mit "bool SleepExec(uint maxTimeMs)" ?
SleepExec(6000);
SleepExec("6000");
bool SleepExec(6000);
bool SleepExec("6000");
Bei 'SleepExec' gibt es die folgenden Varianten ('Überladungen'):
Code: Select all
void SleepExec()
('void' kannst Du als 'nichts' übersetzen. In der Ursprache 'C' musste man dementsprechend das 'void' auch anstatt der leeren Klammern scheiben (also 'void SleepExec(void)' ). Das spart man sich inzwischen und in AngelScript ist es gar nicht mehr gültig, soweit ich weiß, eine leere Parameterliste wird also immer mit leeren Klammern angegeben.)
Code: Select all
bool SleepExec(uint maxTimeMs)
Dementsprechend:
Code: Select all
SleepExec();
Code: Select all
SleepExec(6000);
Im folgenden Beispiel wird ebenfalls die Überladung 'bool SleepExec(uint maxTimeMs)' aufgerufen, hier wird der Rückgabewert aber verwendet, um eine Fallunterscheidung durchzuführen:
Code: Select all
if (SleepExec(5000))
{
MessageBox("Think oder Teach wurde beendet!");
}
else
{
MessageBox("5 s gewartet, aber Think oder Teach noch nicht beendet!");
}
Code: Select all
bool execStopped;
execStopped = SleepExec(5000);
if (execStopped )
{
MessageBox("Think oder Teach wurde beendet!");
}
else
{
MessageBox("5 s gewartet, aber Think oder Teach noch nicht beendet!");
}
Code: Select all
void Start(uint seconds)
bzw.
void Start()
Klärt das Deine Fragen win wenig? Ich weiß, Programierung ist am Anfang etwas mühsam und verwirred, wenn ich mir Deine letzten Skripte aber so anschaue, machst Du beachtlich schnell Fortschritte! Vor allem sehe ich, dass Du schon den wichtigsten Aspekt überhaupt erfasst hast: 'Teile und herrsche!'. Immer alles schön in Unterfunktionen oder sogar neue Skriptdateien auslagern, dann wächst einem ein Programm auch nicht über den Kopf, nur so bleibt die Komplexität beherrschbar!

Viele Grüße,
Thomas