[gelöst] Ellipsenfunktionen und der Stack der Funktion



  • Hallo krümelkacker,

    danke für deine Ausführungen. Leider werden variadische Templates werden bei unserem Compiler leider noch nicht unterstützt. Von daher werde ich mich mal schlau machen wie die va_* Makros expandiert werden.

    Danke auch für den #ifdef Hinweis. Dass werde ich so noch einbauen damit man zumindest eine kleine Sicherheit hat. Vielleicht kann ich mit deinen und SeppJ's Argumenten auch eine Interfaceänderung durchdrücken...

    Greets
    Tobi



  • Du könntest die Elemente auch umkopieren, dann wäre es standardkonform.
    Natürlich kostet das etwas Performance, aber das ist oft verschmerzbar. Kommt halt drauf an wie oft die Funktion aufgerufen wird, und wie rechenaufwendig die Funktion selbst ist.


  • Mod

    hustbaer schrieb:

    Du könntest die Elemente auch umkopieren, dann wäre es standardkonform.

    Aber wie? Das ist doch genau das was hier gesucht ist.



  • SeppJ schrieb:

    hustbaer schrieb:

    Du könntest die Elemente auch umkopieren, dann wäre es standardkonform.

    Aber wie? Das ist doch genau das was hier gesucht ist.

    Das war doch schon einer meiner Vorschläge: lokales Array anlegen, was genügend groß ist...

    const int max_items = 100;
    
    void func(int items, ...)
    {
      assert(items<=max_items);
      unsigned array[max_items];
      va_list vl;
      va_start(vl,items);
      for (int i=0; i<items; ++i) {
        array[i] = va_arg(vl,unsigned);
      }
      va_end(vl);
    
      ... auf array arbeiten ...
    }
    

    ggf auch mit VLAs, falls der Compiler das unterstützt.

    is aber schon irgendwie blöd, dass die Werte in ein Array kopiert werden, wenn sie eh wahrscheinlich schon alle hintereinander im Speicher stehen (siehe va_*-Implementierung).

    kk



  • SeppJ schrieb:

    hustbaer schrieb:

    Du könntest die Elemente auch umkopieren, dann wäre es standardkonform.

    Aber wie? Das ist doch genau das was hier gesucht ist.

    Ich dachte mir dass das "wie" trivial ist, und keiner weiteren Erklärung bedarf. Falls nicht hat es krümelkacker ja jetzt schon gezeigt.
    Was noch fehlt wäre ein alternativer Pfad, der z.B. std::vector verwendet wenn items > max_items .

    ----

    krümelkacker schrieb:

    is aber schon irgendwie blöd, dass die Werte in ein Array kopiert werden, wenn sie eh wahrscheinlich schon alle hintereinander im Speicher stehen (siehe va_*-Implementierung).

    Ja, is doof irgendwie.
    Genau so doof, wie dass man nicht rausbekommt wie viele Bytes überhaupt übergeben wurden.
    Andrerseits ist durch Templates etc. die Motivation vermutlich recht klein, die "..." Geschichte in C++ noch zu verbessern.



  • Hallo hustbaer,
    danke für die Antwort.

    hustbaer schrieb:

    ...
    Ich dachte mir dass das "wie" trivial ist, und keiner weiteren Erklärung bedarf. Falls nicht hat es krümelkacker ja jetzt schon gezeigt.
    Was noch fehlt wäre ein alternativer Pfad, der z.B. std::vector verwendet wenn items > max_items .
    ---

    Leider kenne ich die Anzahl der max_items nicht. Und ich kann auch keinen std::vector nehmen da bei uns keine stl Implementierung benutzt werden darf...

    hustbaer schrieb:

    krümelkacker schrieb:

    is aber schon irgendwie blöd, dass die Werte in ein Array kopiert werden, wenn sie eh wahrscheinlich schon alle hintereinander im Speicher stehen (siehe va_*-Implementierung).

    Ja, is doof irgendwie.
    Genau so doof, wie dass man nicht rausbekommt wie viele Bytes überhaupt übergeben wurden.
    Andrerseits ist durch Templates etc. die Motivation vermutlich recht klein, die "..." Geschichte in C++ noch zu verbessern.

    ACK



  • Tobias Gerg schrieb:

    Leider kenne ich die Anzahl der max_items nicht. Und ich kann auch keinen std::vector nehmen da bei uns keine stl Implementierung benutzt werden darf...

    Naja, dann kannst du zur Not malloc+free verwenden.
    (Bzw. new[] + delete[])



  • Würde ich gerne, aber...

    Tobias Gerg schrieb:

    ...
    Das Problem ist, dass auf unserer Zielplattform kein dynamisches Memorymanagement erlaubt ist.
    ...

    Leider 😞



  • Oops, sorry, übersehen.
    Dann sind wirklich nur mehr VLAs möglich...

    EDIT: oder könntest du die Funktion die ein Array erwartet vielleicht so anpassen dass sie statt dessen eine va_list + einen size_t als Parameter nimmt?



  • Ich bin ja so doof 😃

    Nimm einfach alloca(). Natürlich solltest du vorher gucken ob in der Doku zu deiner Plattform irgendwelche Probleme/Fallstricke erwähnt sind. Normalerweise funktioniert alloca supi, aber bei einigen Plattformen soll es problematisch sein.



  • hustbaer schrieb:

    Ich bin ja so doof 😃

    Nimm einfach alloca(). Natürlich solltest du vorher gucken ob in der Doku zu deiner Plattform irgendwelche Probleme/Fallstricke erwähnt sind. Normalerweise funktioniert alloca supi, aber bei einigen Plattformen soll es problematisch sein.

    👍 Das ist ja mal der Hammer... 😮 Herzlichen dank für den Tipp, da werd ich gleich nochmal das Manual wälzen...


Anmelden zum Antworten