Programme, Funktionen, Libraries
Jedes Programm entspricht einer autonomen Ausführungsabfolge. Rein syntaktisch wird jedes Programm genau wie eine Funktion definiert, allerdings bei festem Funktionsnamen main() und ohne Rückgabewert (void) - im allgemeinen auch ohne Übergabeparameter.
Wie in jeder höheren Programmiersprache erlaubt auch CONTROL die einfache Wiederverwendung öfter benötigter Programmteile. Solche Unterprogramme werden, so wie bei ANSI-C, Funktionen genannt. Diese Funktionen existieren in zwei Grundausprägungen:
Jede Funktion, welche genau einen einzigen Rückgabewert in Form ihres Funktionswertes liefert, entspricht einer Funktion im strengen Sinn.
Wenn ein solches Unterprogramm mehrere Rückgabewerte bereitstellt (darunter kann auch der Funktionswert sein), so spricht man in der Softwaretechnik streng genommen von einer Prozedur.
Wesentliches Element solcher Unterprogramme ist, dass diese lediglich einmal definiert werden und dann an den verschiedensten Stellen in den verschiedenen Programmen aufgerufen werden können, ohne nochmals den Code einbinden zu müssen. Beim Aufruf werden lokal im Programm definierte Variablen oder Konstanten an die Funktion übergeben und das oder die Ergebnisgrößen an eben solche übertragen. Man nennt diese, beim Aufruf übergebenen Größen, "Aktualparameter", während die Entsprechung bei der Definition "Formalparameter" heißt. Jedem, bei der Programmierung der Funktion verwendeten Formalparameter (i.A. Variable) entspricht später also genau ein Aktualparameter des aufrufenden Programms.
All diese Zusammenhänge werden in einschlägigen Beschreibungen der Programmiersprache C sehr detailliert wiedergegeben. Hier soll lediglich an einigen Beispielen die grundsätzliche Verwendung aufgezeigt werden.
main() // Hauptprogramm beginnt hier
{
float a, b, c; // Variablendeklarationen
a = 10; // Zuweisungen
b = 14;
c = sumFunction(a, b); // Aufruf einer Funktion mit genau einem
// Rückgabewert; Übergabe von zwei Aktualparametern
scaleValues(a, b, c, 1.5);// Aufruf einer prozedurartigen Fkt.
// mit mehreren Rückgabewerten
// a, b und c werden durch den Aufruf verändert!
DebugN(a, b, c); // Ausgabe der Ergebnisse in LogViewer
// bzw. Log-File: a = 15, b = 21, c = 36
}
// Ende des Hauptprogramms
// Deklaration der Funktion mit Angabe des Datentyps des Rückgabewerts
float sumFunction(float summand1, float summand2) // Formalparameter
{
// m. Typdeklaration
float sum;
sum = summand1 + summand2; // Verwendung der Formalparameter wie
/ Variablen im Programmcode
return sum; // Rückgabe des Ergebnisses (Wert der
// Variable sum) an das aufrufende Prg.
}
// Deklaration der Funktion mit mehreren Rückgabewerten
int scaleValues(float &a, float &b, float &c, float factor)
{
// '&' definiert:Wert wird
a = a * factor; // rückgeliefert
b = b * factor;
c = c * factor;
if ((a == 0) || (b == 0) || (c == 0)) // Optional kann ein
return 0; // Funktionsrückgabewert
else // z.B. Aufschluss über
return 1; // Fehler geben.
}
Die übergebenen Aktualparameter entsprechen in ihrer Reihenfolge genau den Formalparametern der Deklaration der Funktion.
Alternativ könnte die erste Funktion auch etwas knapper und effizienter programmiert werden - man sieht, dass durch Schachtelung von Ausdrücken oft zusätzliche Variablen eingespart werden können.
float sumFunction(float summand1, float summand2)
{
return summand1 + summand2; // Rückgabewert direkt als Ausdruck
}
Beim Aufruf der Funktion scaleValues() wurde der in der Deklaration vorgesehene Rückgabe-Funktionswert (Datentyp int) nicht berücksichtigt. Um diesen auch auszuwerten, könnte der Aufruf wie folgt aussehen:
if (scaleValues(a, b, c, 1.5) > 0)
DebugN(a,b,c);
else
DebugN("Error");
Die Funktion wird dabei zuerst ausgeführt und anschließend wird ihr Rückgabewert im Kontrollausdruck des if-Konstrukts verglichen.
Zusätzlich zu den hier wiedergegebenen Parameter-Übergaben kennt Control auch so genannte Default-Parameter bei denen ein vordefinierter Parameterwert schon bei der Deklaration angegeben wird. Auch Funktionen mit beliebigen Parameteranzahlen können erstellt werden.
Der Ort an dem eine Funktion deklariert wird, bestimmt den Bereich ihrer Verfügbarkeit in anderen Funktionen:
-
Script lokale Funktionen: Wird eine Funktion direkt unterhalb des Main-Programms z.B. innerhalb eines EventScripts deklariert, so gilt sie lediglich innerhalb dieses Main-Programms und aller anderen, dort deklarierten Funktionen.
-
Panel globale Funktionen: Wird eine Funktion im Abschnitt "General" des Eigenschaften-Fensters (Registerkarte Events) beim Panel-Objekt selbst deklariert, so kann diese in allen Scripts bei allen Grafikobjekten (Shapes) dieses Panels verwendet werden.
-
Managerglobale Funktionen: Werden in eigenständigen Bibliotheken deklariert. Diese Bibliotheken werden in Textdateien im Unterverzeichnis
...
/scripts/libs
der Projekthierarchie erwartet und müssen über die Konfigurationsdateiconfig.level
für die gewünschten Manager "geladen" werden.