Variable Anzahl Parameter an eine Funktion übergeben

Gast #1308256
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.
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.