C-Funktionen mit variabler Anzahl Übergabeparameter

Der Graf

Der Graf

Aktives Mitglied
Thread Starter
Dabei seit
02.06.2004
Beiträge
391
Reaktionspunkte
18
Moin moin!
Es geht mal wieder um ANSI-C, aber nicht nur auf dem Mac, sondern ganz allgemein.
Wie bekomme ich es hin, eine Funktion zu schreiben, bei der ich die Anzahl der Übergabeparameter noch nicht kenne?
Verwenden würde ich sie z.B. gerne so:
Code:
…
meineFkt(3,4,5);
meineFkt(3,4,5,6);
…

Gäbe es nur den oberen Anwendungsfall sähe der Prototyp natürlich so aus:
Code:
int meineFkt(int, int, int);
Ich weiß ja aber noch nicht, mit wie vielen Parametern die Funktion genutzt wird. Wie sieht dann der Prototyp aus, und wie kann ich auf die einzelnen Werte in meiner Funktion zugreifen?

(printf z.B. kann das ja auch ;))
 
Übergeb ein Array of (Datentyp)...also schau dir einfach die Signatur der main Funktion an. Dort sind die "zweiten" Paramter ja auch beliebig...
 
stichwort ist varargs bzw stdargs...
 
  • Gefällt mir
Reaktionen: Der Graf
Übergeb ein Array of (Datentyp)...also schau dir einfach die Signatur der main Funktion an. Dort sind die "zweiten" Paramter ja auch beliebig...
Ja, das ginge natürlich, ist aber nur ein Workaround, und als ein solcher nicht sehr "schön" ;)

stichwort ist varargs bzw stdargs...
Super, das ist es. Danke sehr!

Auf diese Seite hat der normale User leider keinen Zugriff. Ich habe aber dank dem Stichwort "varargs" diesen gefunden, dort wird die printf-Fkt nachgebaut.

Vielen Dank für Eure Antworten! :cake:
 
Weiß nicht. Bei mir kommt die Meldung
HTTP/1.1 403 Access Denied.
Macht ja aber nichts.

Eine Frage noch zu den variablen Parametern: sehe ich das richtig, das ich nicht ermitteln kann, wie viele Parameter übergeben wurden? Sondern mir stattdessen eine "besondere" Variable als End-Markierung übergeben lassen muß?

Also als Beispiel:

meineFkt(3,4,5,0);
meineFkt(3,4,5,6,0);
Dann lese ich die einzelnen Werte in der Funktion mit "va_arg" und überprüfe dann, ob der übergebene Wert "0" ist, nur dann ist die Liste abgearbeitet.
Oder gibt es dafür eine elegantere Variante?
 
Jein. Zum Beispiel macht es printf so, dass ja durch die Anzahl der Platzhalter klar ist, wie viele Argumente folgen müsssen. Deshalb kannst Du
Code:
printf ("A: %d, B: %d\n", a, b);
schreiben und musst nicht
Code:
printf ("A: %d, B: %d\n", a, b, 0);
eingeben.

Aber wenn die Anzahl der Argumente nicht irgendwie berechnet werden kann brauchst Du eine Abbruchbedingung.

Alex
 
  • Gefällt mir
Reaktionen: Der Graf
Super! Ihr habt mir alle sehr geholfen! Vielen Dank!
 
Zurück
Oben Unten