Was sind offene Arrays?
1 Antwort
Das Konzept offener Arrays beschreibt die Möglichkeit für eine Funktion/Prozedur, Arrays variabler Größe über einen Parameter entgegennehmen zu können.
Im Hinblick auf Java ist dieses Konzept nichts, was sonderlich relevant (im Sinne von: besonders interessant) wäre. Es ist eine fest integrierte Funktionalität der Sprache, dass Arrays unterschiedlicher Länge an eine Funktion weitergereicht werden können.
Man sollte sich also eher einmal die Historie für diesen Begriff anschauen. Seinen Ursprung hat das Konzept in der Entwicklungsgeschichte von Pascal (ebenso relevant war es für seine Abkömmlinge wie Ada, Delphi oder Modula-2). Zum einen wollte man zwar typsicher agieren, zum anderen bestand aber das Problem, dass die Arraylänge ein Bestandteil des Typs ist, weshalb Arrays unterschiedlicher Länge nicht unter eine Typspezifikation passten.
Daraufhin wurden conformant array parameters in die Sprache aufgenommen. Diese setzen sich aus drei Angaben zusammen (einem Zeiger auf das Array sowie die obere und untere Grenze des Arrays). Je Pascal-Ableger kannst du auf verschiedene Implementationen und auch Bezeichnungen für diese Idee stoßen. In Ada gibt es beispielsweise unconstraint arrays, in Modula-2 wird neben dem Arrayzeiger nur noch die Länge mit übergeben und bei Delphi spricht man von open array parameters. Da du konkret nach offenen Arrays gefragt hast, gehe ich auf die Delphi-Lösung ein bisschen näher ein.
In Delphi ist es sehr einfach gehalten. Für die Funktion/Prozedur braucht man nur die spezielle array of-Syntax einsetzen, um deutlich zu machen, dass ein offenes Array übergeben werden soll:
procedure PrintSumOfAll(const Numbers: array of Integer);
Die Länge oder die Grenzen des Arrays müssen nicht übergeben werden. Erstere Information wird stattdessen bei Aufruf implizit ermitttelt. Die Indizes für Start und Ende lassen sich innerhalb der Funktion/Prozedur dann über die Befehle Low und High erfragen.
Beispiel:
for I := Low(Numbers) to High(Numbers) do
// ...
Zu beachten ist, dass Delphi verschiedene Typen von Arrays kennt. Ein offenes Array wird als statisches Array (auf dem Stack) angelegt. Seine Größe ist also nicht nachträglich änderbar. Wenn du explizit ein dynamisches Array an eine Funktion/Prozedur übergeben wolltest, müsste dies ungefähr so aussehen:
type
TIntegralNumbers = array of Integer; // dynamic array type declaration
procedure PrintSumOfAll(Numbers: TIntegralNumbers);