002
10.08.2004, 18:40 Uhr
virtual
Sexiest Bit alive (Operator)
|
Das macht man mit den va_* Macros:
C++: |
#include <stdio.h> #include <stdarg.h>
int minimum(int anz, ...) // 1. { va_list args; // 2 int i; int m = 0;
va_start(args, anz); // 3
if (anz>0) { m = va_arg(args, int); // 4 for(i=1; i<anz; ++i) { int n = va_arg(args, int); // 4 if (n<m) m = n; } }
va_end(args); // 5
return m; }
int main() { printf("Das minimum von 1, 2, -1, und 0 ist %d", minimum(4, 1, 2, -1, 0)); } ~
|
Zur erkläung: 1. Eine Funktion mit variabler Anzahl parameter nennt man auch ellipse. Der variable Anteil einer solchen Parameterliste wird mit "..." gekennzeichnet. Für den weiteren Zugriff muß vor dem ... ein weiterer fester parameter da sein (hier anz), manche Funktionen, wie zb printf benutzen hier einen String. Dieser Parameter sollte dafür verwendet werden, die tatsächliche Anzahl der Parameter zu bestimmen. In obigen beispiel geben wir in anz eben diese Anzahl an, printf etwa nimmt den Formatstring zur Bestimmung.
2. Innerhalb der Funktion benötigt man eine Variable vom Typ va_list, welche zur Verwaltung benutzt wird.
3. Diese Liste wird mittels va_start initialisiert. Der zweite Parameter, der dieser Funktion (eigentlich ists ein Macro) übergeben wird ist das letzte feste Argument in der Parameterliste (hier: anz). Danach ist die Liste zu abarbeitung bereit:
4. man kann nun durch die liste der parameter iterieren, von vorne bis hinten. Dies macht man mit va_arg, wobei der zweite parameter angibt, welchen Typ man als Parameter hier erwartet. Wo das Ende der Liste ist, kann man nicht bestimmen, dies ist per Implementierung festzulegen; in diesem Beispiel gibt eben anz die Anzahl an.
5. Nachdem man die Liste durchgeackert hat, muß man va_end Aufrufen. Auf manchen System hat dieser Call keinen Effekt, auf anderen ist es aber so, daß mit va_start dynamisch Speicher belegt wurde, der so nun freigegeben wird. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |