Das CALL-Element ähnelt einer einfachen Anweisung. Der Unterschied besteht darin, dass die ausgeführte Anweisung der Aufruf einer benutzerdefinierten Unterroutine ist (siehe auch Typ), die durch ein anderes Diagramm repräsentiert wird, d. h. die Ausführungssteuerung wird an dieses andere Diagramm delegiert, das nach Abschluss seiner Arbeit die Kontrolle wieder zurückgibt, woraufhin sie an das nächste Element weitergegeben wird.
Unterroutinen können in Prozeduren, die kein Ergebnis zurückgeben und als Befehl verwendet werden, und Funktionen, die einen Wert zurückgeben und als Ausdruck verwendet werden, eingeteilt werden. Daher unterscheiden sich die Aufrufe von Prozeduren und Funktionen leicht in ihrer Syntax. Generell könnten Funktionen in einer Programmiersprache auf beliebigen Verschachtelungsebenen in Ausdrücken aufgerufen werden (wie es bei den eingebauten Funktionen von Structorizer möglich ist). Bei den CALL-Elementen in Structorizer, die auf andere (benutzerdefinierte) Diagramme verweisen, ist dies jedoch anders:
Wenn der Executor ein solches CALL-Element ausführen soll oder wenn der Code-Export funktionieren soll, sollte der CALL nur eine einzige Zeile enthalten, entweder in der Form
Die Argumentliste kann leer sein, aber die Klammern dürfen nicht weggelassen werden. Die Argumente (im obigen Template: wert1 bis wertN) können nicht nur durch Literale oder Variablennamen, sondern auch durch beliebige gültige Ausdrücke mit Operatoren und eingebauten Funktionen dargestellt werden. Die einzige Einschränkung besteht darin, dass die Ausdrücke keine weiteren benutzerdefinierten Routine-CALLs enthalten dürfen. Die Argumentausdrücke sind durch Kommas zu trennen.
Ein Aufruf muss genau so viele Argumentwerte liefern, wie die aufgerufene Routine Parameternamen in ihrer Kopfzeile hat. Sie werden in der Reihenfolge der Parameterliste eins-zu-eins abgebildet. Wenn es überladene Unterroutinen gibt (d. h. mehrere Unterroutinen mit gleichem Namen, aber unterschiedlicher Parameteranzahl), entscheidet die Argumentanzahl des Aufrufs, welche der Routinen aufgerufen wird.
Seit Version 3.29-05 können Unterroutinen optionale Parameter am Ende der Parameterliste haben. In diesem Fall kann der Aufruf von rechts nach links so viele Argumentwerte weglassen, wie Parameter in der Routinekopfzeile mit Standardwerten ausgestattet sind. Diese Standardwerte werden dann anstelle der weggelassenen Argumente verwendet.
Version 3.32-11 führte einen Autovervollständigungsmechanismus im Element-Editor ein, der die Signaturen aller passenden Unterroutinen-Diagramme anbietet, die zum Bearbeitungszeitpunkt im Arranger gehalten werden. Weitere Funktionen sind auf der Seite Content Assist beschrieben.
Beispiel
Hier ist ein einfaches Beispiel eines CALL-Elements (gelb) innerhalb eines Funktionsdiagramms:
Monatslängen-Funktion mit einem Funktionsaufruf
Die aufgerufene Funktion wird durch ein anderes Diagramm definiert (siehe Executor-Handbuch und Arranger-Seite, um zu erfahren, wie Aufrufe in Structorizer ausgeführt werden können):
Eine aufrufbare Funktion
Auf der Seite Laufzeitanalyse finden Sie ein Beispiel für ein recht komplexes Bündel von zusammenwirkenden Routinen bei der Aufgabe des Sortierens eines Arrays; der Kernalgorithmus dort (quickSortRecursive) ist ein Rekursionsbeispiel.
Rekursion
Wenn Sie einen rekursiven Algorithmus schreiben möchten, sollten Sie den rekursiven Aufruf in ein CALL-Element platzieren, wie oben beschrieben. Beispiel:
Rekursive Funktion, nicht funktionsfähig
Rekursive Funktion mit korrekt verwendetem CALL-Element
Obwohl dieses Diagramm eine grundsätzlich korrekte Rekursion zeigt, ist es in Structorizer nicht ausführbar, da das CALL-Element (rot) nicht nur aus Zielvariable, Zuweisungssymbol und Funktionsaufruf besteht, sondern den Funktionsaufruf in eine Multiplikation einbettet.
Diese Version eines rekursiven Fakultätsalgorithmus zerlegt den rekursiven Zweig in die Zuweisung mit dem reinen Aufruf auf der rechten Seite und eine separate Multiplikationsanweisung. Auf diese Weise kann Structorizer ihn ausführen. (Der Ausdruck n-1 als Funktionsargument ist kein Problem.)
Rekursive Funktion, nicht funktionsfähigRekursive Funktion mit korrekt verwendetem CALL-Element
Anweisungstransmutation, Auslagern von Routinen und Bearbeiten
Es gibt einige sehr hilfreiche Funktionen zur Erleichterung der Erstellung von CALL-Elementen oder der zugehörigen Unterroutinen-Diagramme.
Wenn Sie versehentlich einen Unterroutinen-Aufruf in ein einfaches Instruction-Element geschrieben haben, müssen Sie das Element nicht löschen, ein Call-Element einfügen und den gesamten Anweisungstext erneut eingeben. Stattdessen können Sie es durch Klicken auf die Zauberstab-Schaltfläche (Transmutationsschaltfläche) (bei ausgewähltem Instruction-Element) in ein Call-Element (mit demselben Inhalt) transmutieren. Dies kann auch als einfacher Test dienen, ob die Anweisung den oben genannten Syntaxregeln entspricht. (Andernfalls funktioniert die Transmutationsschaltfläche einfach nicht.)
Wenn Sie feststellen, dass ein entworfener Algorithmus zu groß geworden ist und besser zerlegt werden sollte, können Sie Teile des Diagramms in Unterroutinen-Diagramme „auslagern". Wählen Sie einfach die logisch zusammenhängende Elementfolge aus, die Sie zu einer Unterroutine machen möchten, und klicken Sie auf den Menüpunkt "Outsource" (Auslagern). Dadurch werden die ausgewählten Elemente in eine neue Unterroutine verschoben und die Lücke durch einen passenden CALL-Aufruf dieser Unterroutine gefüllt. Siehe Outsourcing für Details.
Sie können die aufgerufene Routine zur Bearbeitung oder Inspektion aufrufen (seit Version 3.29-04). Eine andere Structorizer-Instanz, verbunden über den Arranger, öffnet sich, um die aufgerufene Routine anzuzeigen. Es gibt entsprechende Einträge sowohl im Menü „Edit" als auch im Kontextmenü:
Menüeintrag Edit > Edit subroutine...Kontextmenüeintrag Edit subroutine...
Wenn die referenzierte Routine nicht aus dem Arranger abgerufen werden kann, werden Sie gefragt, ob Sie ein neues Unterroutinen-Diagramm für die referenzierte Signatur erstellen möchten:
Dialog zum Bearbeiten einer Unterroutine
Sie können hier ablehnen oder fortfahren. Im letzteren Fall erstellt Structorizer ein neues leeres Diagramm mit einem aus dem Aufruf grob abgeleiteten Routinekopf, bereit zur Bearbeitung:
Zusätzliche Structorizer-Instanz mit erstellter Routine
Wie Sie sehen, wird das neue Routinen-Diagramm automatisch zur Gruppe des übergeordneten Diagramms hinzugefügt.
Methodendeklarationsreferenzen
Diagramme, die durch Quellcode-Import aus einer objektorientierten Sprache wie Java oder Processing (seit Structorizer-Version 3.31) entstanden sind, können spezielle CALL-Elemente enthalten, die absichtlich als bloße Methodenreferenzdeklarationen zweckentfremdet wurden — sie sind dauerhaft deaktiviert (siehe die grünen Elemente mit schraffierten Seitenbalken am Ende des unten gezeigten Diagramms), ermöglichen aber, das zugehörige Diagramm über den Menüpunkt „Edit Sub-routine ..." in einem zusätzlichen Structorizer-Fenster aufzurufen:
Klassendiagramm mit Methodenreferenz-Aufrufen
Beim COBOL-Import wird dieselbe Zweckentfremdung eingesetzt, um nicht aufgelöste Abschnitts- oder Absatzbezeichnungen aus dem Quellcode in die Diagramme an den entsprechenden Stellen zu platzieren, sodass sie keinen Schaden anrichten können:
Importiertes COBOL-Diagramm mit Bezeichnungsmarkierungen
Ein besonderer Vorteil dieser zweckentfremdeten CALL-Elemente besteht darin, dass Reihen von ihnen (zusammen mit benachbarten echten Deklarationen) mit dem Anzeigemodus Hide mere declarations eingeklappt werden können:
Importiertes COBOL-Diagramm mit eingeklappten Bezeichnungsmarkierungen
Beachten Sie, dass solche speziell umgeleiteten CALL-Elemente nicht manuell eingefügt oder erzeugt werden können — sie entstehen ausschließlich als Produkt des Quellcode-Imports. Seit Version 3.32-20 unterscheiden sie sich visuell von deaktivierten gewöhnlichen CALL-Elementen durch ihre Schraffur: Während deaktivierte gewöhnliche CALL-Elemente vollständig schraffiert sind, ist die Schraffur dieser Methoden-/Bezeichnungsreferenz-Elemente auf die Seitenbalken beschränkt.