C-Funktionen mit variabler Anzahl Übergabeparameter

Der Graf

Mitglied
Thread Starter
Mitglied seit
02.06.2004
Beiträge
391
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 ;))
 

timbajr

Mitglied
Mitglied seit
22.04.2005
Beiträge
582
Übergeb ein Array of (Datentyp)...also schau dir einfach die Signatur der main Funktion an. Dort sind die "zweiten" Paramter ja auch beliebig...
 

Der Graf

Mitglied
Thread Starter
Mitglied seit
02.06.2004
Beiträge
391
Ü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:
 

Der Graf

Mitglied
Thread Starter
Mitglied seit
02.06.2004
Beiträge
391
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?
 

below

Aktives Mitglied
Mitglied seit
15.03.2004
Beiträge
13.564
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
 

Der Graf

Mitglied
Thread Starter
Mitglied seit
02.06.2004
Beiträge
391
Super! Ihr habt mir alle sehr geholfen! Vielen Dank!
 
Oben