www.wikidata.de-de.nina.az
Als variadische Funktion bezeichnet man in Programmiersprachen Funktionen Prozeduren oder Methoden mit unbestimmter Aritat also solche deren Parameteranzahl nicht bereits in ihrer Deklaration festgelegt ist In einigen Sprachen wie C C Java und Lua wird dies in der Funktionsdeklaration mit Auslassungspunkten angezeigt der sogenannten Ellipse An Stelle der Ellipse konnen beliebig viele Argumente oder auch keine ubergeben werden Nutzlich sind variadische Funktionen beispielsweise bei der Verknupfung mehrerer Zeichenketten oder beim Aufsummieren von Zahlenreihen und generell bei Operationen die prinzipiell auf eine beliebige Anzahl Operanden angewandt werden konnen In Abhangigkeit von den Konventionen der Programmiersprache konnen die Argumente unterschiedliche Datentypen haben z B in JavaScript oder mussen denselben Datentyp haben z B in Java Inhaltsverzeichnis 1 Umsetzung in verschiedenen Programmiersprachen 1 1 C 1 2 C 1 3 C 1 4 Go 1 5 Java 1 6 JavaScript 1 7 Lua 1 8 Perl 1 9 PHP 1 10 Ruby 1 11 Python 1 12 Swift 1 13 Tool Command Language 1 14 Haskell 2 Siehe auch 3 EinzelnachweiseUmsetzung in verschiedenen Programmiersprachen BearbeitenC Bearbeiten Der Zugriff auf variadische Parameter erfolgt hier uber spezielle Makros 1 Einige Bibliotheksfunktionen von C sind mit Ellipse deklariert da es in C keine Moglichkeit der Funktionsuberladung gibt Beispiele sind die Bibliotheksfunktionen printf und scanf zur formatierten Aus beziehungsweise Eingabe 2 Ein grundlegendes Problem bei diesem Mechanismus ist dass der aufgerufenen Funktion keine Information uber Anzahl und Typ der ubergebenen Argumente zur Verfugung steht Der Programmierer muss also durch zusatzliche Massnahmen wie etwa mit dem format string bei printf sicherstellen dass die Argumente richtig interpretiert werden und nicht mehr Argumente verarbeitet werden als tatsachlich vorhanden waren Ausserdem muss mindestens ein fester Parameter vor der Ellipse angegeben werden Die Funktionsparameter werden bevor sie an die Funktion ubergeben werden automatisch nach folgendem Schema in grossere Typen umgewandelt Ausgangstyp Zieltypchar signed char short intunsigned char unsigned short unsigned intfloat doubleAlle anderen Typen bleiben erhalten Beispielsweise konnte man in C den Mittelwert von beliebig vielen Ganzzahlen uber folgende Funktion errechnen lassen include lt stdarg h gt double mittelwert int num zahlen va list argumente int i double summe 0 va start argumente num zahlen Benotigt den letzten bekannten Parameter um die Speicheradresse der anderen Parameter berechnen zu konnen for i 0 i lt num zahlen i summe va arg argumente double Inkremetiert argumente zum nachsten Argument va end argumente return summe num zahlen C Bearbeiten In C sind Ellipsen im C Stil zwar weiterhin moglich aber sie gelten als uberholt da C elegantere Moglichkeiten zur Funktionsuberladung und das Konzept der Defaultargumente bietet Ellipsen gelten zudem als schlechter Stil da sie keine Typsicherheit bieten 3 Ausserdem lassen sich nicht alle Datentypen als Teil einer Ellipse ubergeben In C gibt es zusatzlich noch die Moglichkeit variadische Funktionstemplates zu benutzen Diese sind typsicher aber aufwandiger zu benutzen da man die sogenannten template parameter packs rekursiv auflosen muss unsigned produkt unsigned u return u Rekursions Ende template lt typename Args gt unsigned produkt unsigned u1 Args rest return u1 produkt rest Aufruf unsigned p produkt 1 2 3 4 5 veraltet In C 17 werden sogenannte fold expressions eingefuhrt 4 mit denen sich variadische Funktionen wie im obigen Beispiel stark vereinfachen lassen template lt typename Args gt unsigned produkt Args factors return 1u factors Des Weiteren lassen sich Ellipsen oft durch eine std initializer list ersetzen wobei die Syntax beim Aufruf leicht abweicht da die Argumente in geschweifte Klammern gefasst werden mussen unsigned produkt std initializer list lt unsigned gt factors return std accumulate factors begin factors end 1u std multiplies lt unsigned gt Aufruf unsigned p produkt 1 2 3 4 5 C Bearbeiten In C wird in der Deklaration das Schlusselwort params verwendet Auch der Typ wird mit angegeben Einer solchen Methode kann eine durch Kommas getrennte Liste ubergeben werden diese Liste kann auch leer sein Nach dem Schlusselwort params sind keine weiteren Parameter mehr zulassig Zudem darf es nur einmal in der Methodendeklaration vorkommen 5 public class Summe public static int sum params int list int result 0 for int i 0 i lt list Length i result list i return result static void Main int a sum Ergebnis a 0 int b sum 1 Ergebnis b 1 int c sum 1 2 3 4 Ergebnis c 10 Go Bearbeiten Die Sprache Go erlaubt die Deklaration variadischer Funktionen uber den Anhang einer Ellipse an den Namen des letzten Parameters 6 Es konnen dann beliebig viele Parameter des angegebenen Types ubergeben werden diese sind dann uber ein Slice in der aufgerufenen Funktion verfugbar Ferner ist es moglich durch Anhangen einer Ellipse an den letzten Parameter im Aufruf einer variadischen Funktion direkt ein Slice an Stelle einzelner Parameter zu ubergeben Es folgt ein Beispiel analog zu obigem C Beispiel Deklariere eine Funktion Sum die mit beliebig viele Parameter vom Typ int aufgerufen wird und die Summe ihrer Parameter zuruckgibt func Sum x int n int for i range x Iteriere uber alle Indizes von x n x i return Beispielfunktion zum Aufruf der Funktion Sum func ExampleSum Sum leere Summe Gibt 0 zuruck Sum 1 2 3 Gibt 6 zuruck x hat den Wert int 1 2 3 v int 23 42 1337 Sum v Wie Sum 23 42 1337 Java Bearbeiten Auch in Java verwendet man in der Deklaration die Ellipse Hier spricht man von Methoden mit variabler Argumentanzahl oder kurz Varargs 7 Im Gegensatz zu C wird aber der Typ mit angegeben Im Hintergrund wird die Parameterliste in ein Array ubersetzt so dass auch innerhalb des Funktionsrumpfes der Parameter wie ein Array behandelt werden muss 8 JavaScript Bearbeiten In JavaScript werden die beliebig vielen Funktionsargumente dem arguments Objekt ubergeben das ein Array artiges Objekt mit den zusatzlichen Eigenschaften arguments length und arguments callee ist Mit dem arguments Objekt konnen sogar die Funktionsparameter uberschrieben werden wie das nachfolgende Beispiel zeigt function meineFunk x arguments 0 5 die Variable x wird hier uberschrieben x ist nun 5 Seit ECMAScript 2015 ist es moglich Funktionsargumente mittels rest Parameter in Form einer Ellipse zu sammeln function sum items return items reduce s i gt s i 0 sum 0 sum 1 1 sum 1 2 3 6 sum 1 2 5 8 Lua Bearbeiten In Lua kann in der Parameterdeklaration einer Funktion als letztes auch einziges Argument die Ellipse angegeben werden Diese kann dann an andere Funktionen weitergereicht werden wodurch sie sich nach Lange Anzahl und einzelnen Elementen analysieren lasst namentlich mittels select Perl Bearbeiten Da in Perl 5 die Argumente ohne Rucksicht auf ihren Typ im Spezialarray landen sind alle Subroutinen immer variadisch solange es kein Prototyp explizit verhindert Die mit 5 20 eingefuhrten optionalen Signaturen prufen die Aritat Damit sind nur solche Routinen variadisch deren letzter Parameter ein Array oder Hash verlangt gerade Anzahl von Werten ist In Perl 6 kann man als letzten Parameter ein slurpy Array angeben welches mit dem Prafix gekennzeichnet ist und alle zusatzlichen Argumente aufsaugt PHP Bearbeiten PHP unterstutzt erst ab Version 4 variadische Funktionen Bis Version 5 5 wird kein besonderes Kennzeichen in der Funktionsdeklaration verwendet die Argumente konnen mit Hilfe spezieller Funktionen ausgewertet werden 9 Ab Version 5 6 stehen variadische Funktionen als natives Sprachfeature uber die Ellipse zur Verfugung 10 In Versionen vor 5 6 kann eine variadische Funktion bspw wie folgt definiert werden function sum beliebig viele Argumente result 0 foreach func get args as i result i hier wird davon ausgegangen dass alle Parameter vom Typ Integer sind return result Beispielhafter Aufruf der Funktion sum echo sum gibt 0 aus echo sum 1 2 gibt 3 aus echo sum 4 4 5 7 gibt 20 aus Ab PHP 5 6 0 kann dieselbe Funktion wie folgt umgesetzt werden function sum values result 0 foreach values as i result i hier wird davon ausgegangen dass alle Parameter vom Typ Integer sind return result Die Ausgabe beim Aufruf von sum ist dieselbe wie beim Beispiel fur Versionen vor 5 6 0 Der Vorteil bei der Umsetzung von variadischen Funktionen ab Version 5 6 0 ist dass hierbei auch das sogenannte Type Hinting eingesetzt werden kann wodurch innerhalb der Funktion eine Uberprufung auf einen korrekt ubergebenen Objekttyp entfallen kann So besteht in den oben genannten Beispielen das Problem dass ein Nutzer der Funktion sum dieser auch einen String anstelle eines Integers ubergeben konnte was ggf zu einer falschen Ausgabe oder einer Exception fuhren konnte wenn die Funktion Objekte eines bestimmten Typs erwartet Mit variadischen Funktionen ab PHP 5 6 0 kann die obere Funktion bspw wie folgt mit Type Hinting umgesetzt werden class IntObject private value public function construct value this gt value value public function getValue return this gt value function sum IntObject values result 0 foreach values as i result i gt getValue Ein Zugriff auf die Funktion getValue ist ohne weitere Uberprufung moglich da PHP bereits uberpruft hat dass alle Werte in values vom Typ IntObject sind return result Aufgrund der Tatsache dass PHP s Type Hinting erst ab Version 7 0 skalaren Typen wie Integer oder String unterstutzt wurde fur dieses Beispiel die simple Klasse IntObject definiert welche einen Wert speichern kann der bspw auch eine Zeichenkette sein kann Fur die schematische Darstellung genugt dieses Beispiel auch wenn es trotz allem keine Typensicherheit umsetzt Ruby Bearbeiten In Ruby werden variable Argumentanzahlen durch einen Stern vor dem Parameternamen gekennzeichnet 11 Auch hier wird dieser Parameter als ein Array behandelt in dem alle Argumente gesammelt werden die der vorgegebenen Anzahl an Argumenten folgen Python Bearbeiten Python bietet dieselbe Funktionalitat wie Ruby Daruber hinaus kann man uberzahlige Argumente benennen und deren Namen zusammen mit dem Wert in einer Tabelle Worterbuch im Python Jargon speichern wenn Parameternamen zwei Sterne vorangestellt sind 12 Swift Bearbeiten In Swift wird eine variable Parameteranzahl mit drei Punkten hinter der Deklaration des Parameters gekennzeichnet Innerhalb der Funktion stehen alle ubergebenen Werte als Array zur Verfugung 13 func summiere zahlen Int gt Int var sum 0 for zahl in zahlen sum zahl return sum Tool Command Language Bearbeiten In Tcl wird eine variable Parameteranzahl mit dem Wort args als letztes Element der Parameterliste gekennzeichnet Innerhalb der Funktion stehen alle ubergebenen Werte als Liste mit diesem Namen zur Verfugung 14 proc summiere args return expr join args puts summiere 4 10 8 gibt 22 aus ganzzahlig puts summiere 4 5 1 6 gibt 11 5 aus Fliesskommazahl Haskell Bearbeiten Haskell erlaubt es nicht direkt variable Argumentanzahlen zu verwenden allerdings kann man dies uber trickreiche Verwendung von Typklassen nahezu beliebig nachbilden So sind mit einer entsprechenden Implementation z B auch typsichere variadische Funktionen mit verschiedenen Argumenttypen moglich 15 16 Siehe auch Bearbeitenvariadische Makros variadische TemplatesEinzelnachweise Bearbeiten Variable Argumentlisten in C Abgerufen am 9 September 2010 Definition von printf Abgerufen am 9 September 2010 englisch Ellipses and why to avoid them Abgerufen am 9 September 2010 englisch http en cppreference com w cpp language fold Params in C Abgerufen am 23 August 2013 englisch Spezifikation der Sprache Go Abgerufen am 26 Marz 2014 englisch Varargs in Java Archiviert vom Original am 15 April 2018 abgerufen am 10 Juni 2020 Varargs in Java im Sprachuberblick auf oracle com Abgerufen am 1 September 2011 englisch Variadische Funktionen in PHP Abgerufen am 9 September 2010 PHP Dokumentation Funktionsparameter Abgerufen am 8 September 2015 David Thomas Andrew Hunt Programmieren mit Ruby Addison Wesley Munchen 2002 ISBN 3 8273 1965 X S 281 eingeschrankte Vorschau in der Google Buchsuche Abschnitt Function Definition in der Python Schnellubersicht Archiviert vom Original am 26 Januar 2014 abgerufen am 9 September 2010 englisch Variadic Parameters flexible Funktionen in Swift Abgerufen am 13 September 2016 proc manual page Abgerufen am 6 Oktober 2019 englisch Implementierung in Haskell mit detaillierter Beschreibung Abgerufen am 12 August 2010 englisch Beschreibung des Vorgehen bei der Haskell Variante von printf zur Erzeugung einer polyvariadischen Funktion Abgerufen am 12 August 2010 englisch Abgerufen von https de wikipedia org w index php title Variadische Funktion amp oldid 232428424