Forum: Compiler & IDEs Variable Anzahl Parameter an eine Funktion übergeben


von Thomas (Gast)


Lesenswert?

hallo,

ich möchte an eine funktion eine variable anzahl parameter übergeben.
bisher tat ich dieses immer wie folgt
1
void main_menue_create(Uint8 u8_layout, ...)

quasi lässt sich dieses mit "..." erschlagen und dann mit va_end etc. 
auf die parameter zugreifen. problem dabei ist, dass ich mindestens 
einen parameter "fest" übergeben muss; im beispiel u8_layout.

gibt es eine weitere möglichkeit?
quasi suche ich nach
1
void main_menue_layout(...)

Merci - programmiert wird in C, verwendet wird der GCC in aktueller 
version.

von Karl H. (kbuchegg)


Lesenswert?

Thomas schrieb:
> hallo,
>
> ich möchte an eine funktion eine variable anzahl parameter übergeben.
> bisher tat ich dieses immer wie folgt
>
1
> void main_menue_create(Uint8 u8_layout, ...)
2
>
>
> quasi lässt sich dieses mit "..." erschlagen und dann mit va_end etc.
> auf die parameter zugreifen. problem dabei ist, dass ich mindestens
> einen parameter "fest" übergeben muss; im beispiel u8_layout.
>
> gibt es eine weitere möglichkeit?

So nicht.
Die Funktion benötigt ja irgendeine Information an hand derer sie die 
Anzahl bzw. die Datentypen der Argumente feststellen kann.
(Denk einfach immer nur an printf. Der Formatstring dient dir zwar 
hauptsächlich um die Formattierung festzulegen. Für printf selber ist 
aber das Wichtigste, dass ihm die ganzen %f, %d und Konsorten mitteilen, 
was denn eigentlich alles mitgegeben wird. Die eigentliche Formatierung 
ist nur Zugabe :-)


> quasi suche ich nach
1
void main_menue_layout(...)

Wenn die Datentypen der Argumente feststehen und nur deren Anzahl 
variiert: Warum steckts du nicht einfach alle Argumente in ein Array und 
übergibst der Funktion deren Anzahl und einen Pointer auf das Array. Was 
für main() gut genug ist, wird wohl für dich auch gut genug sein :-)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Thomas schrieb:
> quasi suche ich nach
1
void main_menue_layout(...)

Wie willst du daraus die Anzahl der zu verarbeitenden Argumente 
ableiten?
Du hast bei so einer Funktion immer mindestens einen benamten Parameter. 
Du hast ja keine Kristallkugel, und GCC auch nicht ;-)

Johann

von Rolf Magnus (Gast)


Lesenswert?

> Wie willst du daraus die Anzahl der zu verarbeitenden Argumente
> ableiten?

Zum Beispiel, indem der letzte einen speziellen Wert hat.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Rolf Magnus schrieb:
>> Wie willst du daraus die Anzahl der zu verarbeitenden Argumente
>> ableiten?
>
> Zum Beispiel, indem der letzte einen speziellen Wert hat.

Wenn es einen letzten Wert gibt, dann gibt es auch einen ersten. Im 
Gegensatz dazu suggeriert void foo (...) daß foo auch ohne Parameter 
aufgerufen werden sollte.

Es geht also sowas:
1
#ifndef LAYOUT_H
2
#define LAYOUT_H
3
4
enum
5
{
6
   ITEM_A,
7
   ITEM_B,
8
   ITEM_C,
9
10
   NO_ITEM
11
};
12
13
#define LAYOUT(X,Y...) layout (X, ##Y, NO_ITEM)
14
15
extern void layout (int, ...);
16
17
#endif // LAYOUT_H
18
// Ende header
19
20
#include <stdarg.h>
21
22
void layout (int data, ...)
23
{
24
    va_list vlist;
25
    va_start (vlist, data);
26
27
    if (NO_ITEM != data) while (1)
28
    {
29
        data = va_arg (vlist, int);
30
        if (NO_ITEM == data)
31
            break;
32
        // mach was mit data
33
    } 
34
35
    va_end (vlist);
36
}

Dann kannst du sagen
1
LAYOUT (ITEM_A, ITEM_B);
2
LAYOUT (ITEM_A, ITEM_B, ITEM_B, ITEM_B, ITEM_C);
3
LAYOUT (ITEM_C);
4
...
und es wird immer automatisch ein Listenende angehängt. Die Liste darf 
aber nicht leer sein, zumindest nicht wenn du das Makro verwendest. Für 
eine leere Liste ist der Aufruf
1
layout (NO_ITEM);
und natürlich geht das alles auch ohne das LAYOUT-Makro.

Johann

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.