Unspeziifierte Anzahl an Argumenten



  • Hi!

    Ich rufe:

    template <typename T> T getMax(T firstArg, ...)
    {
      va_list ap;
      va_start(ap, firstArg);
    
      T max = firstArg;
      while (true)
      {
        T* arg = va_arg(ap, T*);
        if (arg == 0) break;
        if (*arg > max) max = *arg;
      }
    
      va_end(ap);
    
      return max;
    }
    

    mit

    double max = getMax<double>(a1, a2, a3);
    

    auf.

    Kompiliert super, funktioniert aber leider nicht.
    getMax gibt immer nur firstArg zurück. Die Schleife wird sofort per break verlassen.
    Weiß jemand wieso?
    Ich benutze den DevC++.

    MfG



  • man: va_arg liefert keinen Pointer auf das jeweilige Element, sondern das Element selber. Also sollte es richtiger heißen:

    while (true)
    {
        T arg = va_arg(ap, T);
        if (arg == T()) break;
        if (arg > max) max = arg;
    }
    

    Und du mußt als Abbruchbedingung als letztes Element eine 0 in deinen Aufruf schreiben (in deiner variablen Argumentliste muß die Information stehen, wo die Argumente zu Ende sind, va_arg() würde dir sonst Pseudo-Argumente liefern, bis es an die Stack-Grenzen kracht).



  • warum machst du nicht ne std::list oder std::vector mit den Werten und übergibst sie?

    Variable Argumentenlisten sind unter C++ sehr sehr unerwünscht.



  • oder wieso übergibst du nicht einfach 2 iteratoren?

    template <typename Iterator> 
    Iterator getMax(Iterator pos, Iterator end)
    {
      Iterator max=pos;
      while (pos!=end)
      {
        if (*pos > *max) max = *pos;
        ++pos;
      }
      return max;
    }
    

    musst du dann so aufrufen:

    std::vector<double> vec;
    //füllen...
    vec.push_back(3.3);
    vec.push_back(5.37);
    vec.push_back(7);
    vec.push_back(18.356);
    vec.push_back(9.238);
    
    double max=*getMax(vec.begin(),vec.end());
    

Anmelden zum Antworten