www.mikrocontroller.net

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


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

ich möchte an eine funktion eine variable anzahl parameter übergeben.
bisher tat ich dieses immer wie folgt
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
void main_menue_layout(...)

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas schrieb:
> hallo,
>
> ich möchte an eine funktion eine variable anzahl parameter übergeben.
> bisher tat ich dieses immer wie folgt
>
> 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?

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
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 :-)

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas schrieb:
> quasi suche ich nach
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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wie willst du daraus die Anzahl der zu verarbeitenden Argumente
> ableiten?

Zum Beispiel, indem der letzte einen speziellen Wert hat.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
#ifndef LAYOUT_H
#define LAYOUT_H

enum
{
   ITEM_A,
   ITEM_B,
   ITEM_C,

   NO_ITEM
};

#define LAYOUT(X,Y...) layout (X, ##Y, NO_ITEM)

extern void layout (int, ...);

#endif // LAYOUT_H
// Ende header

#include <stdarg.h>

void layout (int data, ...)
{
    va_list vlist;
    va_start (vlist, data);

    if (NO_ITEM != data) while (1)
    {
        data = va_arg (vlist, int);
        if (NO_ITEM == data)
            break;
        // mach was mit data
    } 

    va_end (vlist);
}

Dann kannst du sagen
LAYOUT (ITEM_A, ITEM_B);
LAYOUT (ITEM_A, ITEM_B, ITEM_B, ITEM_B, ITEM_C);
LAYOUT (ITEM_C);
...
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
layout (NO_ITEM);
und natürlich geht das alles auch ohne das LAYOUT-Makro.

Johann

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.