Funktion überladen - beliebig viele Parameter?



  • Ich brauche eine Funktion, die beliebig viele Parameter übernimmt. Normalerweise müsste ich ja für jede Parameteranzahl eine neue Funktion definieren/überladen. zB.:
    Testfunktion(x,y);
    Testfunktion(x,y,z);

    Leider weiß man aber vorher noch nicht, wie viele Parameter es werden:
    Wenn ich:
    Testfunktion(4,7,2,3,6,1,0,354,23,1);
    schreibe, soll die Funktion ein neues Array mit diesen Werten erzeugen, welches natürlich die richtige Länge haben muss. Gibt es dafür eine Möglichkeit??? 😕 😕 😕





  • Du kannst eine Funktion mit beliebig vielen Parametern erstellen, jedoch musst diese mindestens einen festen parameter haben, so z.B. void foo (int x, ...);
    Intern verarbeitest du die Parameter dann mit 3Makros, die hab ich jetzt allerdings nicht im Kopf sind aber in jedem C Buch zu finden.



  • Die variablen Parameter Listen aus C sind aber nur für PODs erlaubt, wenn jemand mal ein Objekt übergibt, erzeugt er undefined behaviour! ⚠



  • Ahhhhh thx, genau das isses!
    Ist zwar ein bissl blöd, dass diese Makros net selber sehen wann die Parameter zuende sind, aber ich denke ich weiß schon wie ich das eleganter löse!

    Also Danke nochmal für die schnelle Hilfe! 👍

    PS: Was ist ein POD? Objekte werden bei mir net übergeben, nur floats oder ints.



  • PODs sind die Built-in Typen



  • SirLant schrieb:

    PODs sind die Built-in Typen

    Blödsinn, PODs (plain old data) sind Strukturen mit trivialen Konstruktoren bzw. ohne ctor, wie man sie aus C kennt.



  • Mensch, ich lern ja heut noch richtig was dazu! Und das an einem Samstag 😉

    Also sind PODs quasi alle Objekte, die man benutzen kann, ohne irgendwas zu inkludieren, oder darf man ein int oder so nicht als Objekt bezeichnen?

    (Ich wusste gar net das Strukturen Konstruktoren haben)



  • Strukturen sind in C++ wie Klassen, nur das der default Zugriffsschutz public is.



  • PODs werden auch als Aggregates bezeichnet, das heißt es sind Strukturen ohne benutzdefinierte Konstruktoren, static Elemente, virtuelle Funktionen Basis-Klassen und bei welchen alle Elemente public sind z.B:

    struct A
    {
        int a, b, c;
        float d;
    };
    

    Der einzige Unterschied zwischen einer struct und einer Klasse liegt daran, dass bei einer struct alle Elemente by default public sind, auch bei der Ableitung ist die Zugriffsebene public:

    struct B : A { };
    
    //ist äquivalent zu
    
    class B : public A
    {
    public:
    };
    


  • FAQ



  • kingruedi schrieb:

    Parameter Listen

    Ich bin ja ungern die off-topic-Spaßbremse, aber ich stolpere jedes Mal wieder über deine getrennten Nomen... So etwas gibt es im Deutschen *nie*.

    Weitermachen.
    🙂



  • Shlo schrieb:

    struct B : A { };
    
    //ist äquivalent zu
    
    class B : public A
    {
    public:
    };
    

    also geht mit beiden versionen dann

    void f(struct B b);
    

    ?



  • Wenn man struct weglässt, warum sollte es nicht gehen?



  • operator void schrieb:

    kingruedi schrieb:

    Parameter Listen

    Ich bin ja ungern die off-topic-Spaßbremse, aber ich stolpere jedes Mal wieder über deine getrennten Nomen... So etwas gibt es im Deutschen *nie*.

    Weitermachen.
    🙂

    Nix deutsch 😉 Beim programmieren schreibt man ja eh immer so eine Art Denglisch 😉

    (werd mich versuchen zu bessern)



  • denglisch ist furchbare eine abart ( IMHO )

    wozu überhaupt mit solchen macros arbeiten ?
    man kann doch einfach einen pointer übergeben
    und dann halt um die bytes immer dazuaddieren, um mehrere parameter einzulesen
    z.b.:

    function foo(int anzahl, int* params)
    {
        int s = 0;
        for ( int i = 0; i < anzahl; i++ )
        { 
            s += (*params);
            params += sizeof(int);
        }
        return s;
    }
    

    dann hat man auch die kontrolle über den typ der parameter



  • oder was noch besser ist:

    template <class T*>
    function foo(int anzahl, T params)
    {
        int s = 0;
        for ( int i = 0; i < anzahl; i++ )
        { 
            s += (*params);
            params += sizeof(*T);
        }
        return s;
    }
    

    I love templates 🙂


Anmelden zum Antworten