Forum: PC-Programmierung Funktionen mit variabler Parameteranzahl


von Ralf (Gast)


Lesenswert?

Hallo,

gibt es in C bei Verwendung von Funktionen mit variabler
Parameteranzahl eine Möglichkeit, die Anzahl der Parameter zu
erkennen?

Danke

Ralf

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Um so etwas zu implementieren, dienen die Funktionen va_start und
va_arg, deren Deklarationen neben anderem benötigten Kram in der
Headerdatei "stdargs.h" zu finden sind.

Mal im C-Buch nach "va_start" suchen.

(Thema vom 3.8.05)

von Hubert (Gast)


Lesenswert?

@Rufus T. Firefly (Rufus)

nett, dass es Dich gibt...

@Ralf

Man kann auch einfach einen Pointer übergeben und dann die Bytes
zählen, die die einzelnen Parameter haben, schon mal was von Stack
gehört?

va_start und Konsorten blähen das Programm derart auf, dass man mit
wenig Flash dann nix mehr übrig hat.

va_start und Konsorten sind für embedded-programmig absolut ungeeignet,
da sie meistens als eierlegende Wollmilchsau implementiert
sind.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Da dieser Forenabschnitt "PC-Programmierung" genannt wird, ist nicht
auszuschließen, daß Ralf vielleicht doch etwas anderes als einen
Microcontroller programmieren möchte.

Der Vorteil von va_start und Konsorten ist deren Portabilität; direkte
Stackmanipulationen sind das nicht.

Einen Glückwunsch an Hubert:
Das ist der erste halbwegs konstruktive Beitrag von Dir! Geht doch!

Was exakt meinst Du mit

  "va_start und Konsorten blähen das Programm derart auf,
  dass man mit wenig Flash dann nix mehr übrig hat." ?

Könntest Du das mit Codegrößenbeispielen belegen?

von Hubert (Gast)


Lesenswert?

Ja, habe ich glatt übersehen, dass wir beim PC sind, da würde ich auch
va_start und Konsorten verwenden.

von Hubert (Gast)


Lesenswert?

naochmal an Rufus T. Firefly (Rufus)@


Der Vorteil von va_start und Konsorten ist deren Portabilität; direkte
Stackmanipulationen sind das nicht.

Was fällt Dir an diesem Satz, Deinem Satz auf?

von Rolf Magnus (Gast)


Lesenswert?

Lustig finde ich ja, daß keine von euch die Frage gelesen zu haben
scheint. Es geht überhaupt nicht darum, wie man variable Argumentlisten
umsetzt, sondern woher die Funktion weiß, wieviele Argumenten man denn
übergeben hat.
Nun, dafür gibt es zwei übliche Wege. Entweder verwendet man eins der
festen Argmente, um daüber direkt (einfach ein Integer mit der Anzahl)
oder indirekt (wie z.B. bei printf über den Formatstring) an die Anzahl
zu kommen oder man benutzt einen speziellen Wert, den man als
Ende-Marker noch dranhängt.
Es gibt keine Möglichkeit, die Funktion so zu schreiben, daß sie
automatisch ohne Hilfe des Aufrufers die Anzahl erkennen kann.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

So ein Mist. Recht hast Du!

von Ralf (Gast)


Lesenswert?

Erstmal ein Danke an alle.

@Rufus:

Es geht mir im allgemeinen um C an sich, im speziellen tatsächlich um
Microcontroller. Ob ich es mal auf PC-Seite brauche, will ich ja nicht
ausschließen, und da ich es eben für beides brauchen kann, hab ich es
extra ins Programmier- und nicht ins Elektronik-Forum gestellt.

Die Sache mit dem va_start und va_arg ist mir bekannt, nur wusste ich
eben nicht, wie ich darauf schließen kann, den letzten Parameter
erhalten zu haben.

@Hubert:

> Man kann auch einfach einen Pointer übergeben und dann die Bytes
> zählen, die die einzelnen Parameter haben, schon mal was von Stack
> gehört?

Habs noch nicht begriffen. Kannst du es bitte genauer erläutern,
vielleicht mit Beispiel?

Die Sache mit der Portabilität ist für das aktuelle Projekt nicht
wichtig, jedoch ist der Hinweis sehr nützlich. Ich kann mir vorstellen,
dass man es vergisst, portabel zu programmieren, wenn man auf beiden
Seiten (µC + PC) programmiert.

@Rolf:

Treffer! Du hast genau die Problematik erfasst (soll keine Kritik an
den anderen sein!).

Mal sehen, ob ich es begriffen habe. Möglichkeit 1, indirekt scheidet
denke ich aus, da ich nicht mit Format-Strings arbeiten möchte
(zumindest nicht im aktuellen Projekt).

Der direkte Weg ist mir noch nicht ganz klar. Der erste Parameter gibt
also die Anzahl der Parameter an. Mit va_start initialisiere ich den
Pointer, der auf die weiteren Argumente nach dem ersten Argument zeigt,
richtig?

Möglichkeit 2, mit Ende-Marker ist glaub ich auch nicht das richtige,
da es m.E. vor allem im µC-Bereich vorkommen kann, dass jeder mögliche
Wert als Parameter übergeben wird, also auch der Endemarker als Daten.

Also, ich denke, Möglichkeit 1, direkt ist das richtige für mich.

Ralf

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

Mit va_start bekommst du einen Wert zurückgegeben, den du nicht direkt
verwendest, sondern bei weiten Aufrufen von va_arg angibst. Damit holst
du die dann die Parameter. Den Typ der Parameter musst du für va_arg
wissen.

Beispiel:

void func( int anzahl, ... )
{
 va_list l;
 va_start( l, anzahl );
 for (int i = 0; i < anzahl; i++ )
   DoSomething( va_arg( l, int ) );
 va_end( l );
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.