Variable Anzahl Parameter an eine Funktion übergeben

Gast #1308256
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.
#1308271
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 :-)
Persönliche Seite #1308882
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren