cdecl - Parameter



  • Hallo,

    Wie komme ich an Parameter, die per cdelc übergeben worden sind?
    Eine Möglichkeit ist natürlich va_list, aber davon mal abgesehen, gibt es da eine andere gängige Möglichkeit?

    Alternativ hab ich es mal mit folgender dreckigen Variante probiert:

    void write(char* Str, ...){
        UINT* addr = &Str;
        void* arg2 = addr+1;
        // ...
    
    }
    

    Funktioniert zwar, scheint mir aber sehr daneben zu sein 🤡

    Gruß




  • Mod

    Wenn du übrigens wirklich C**++** mit Ellipsen machst (d.h. du hast dich nicht im Forum geirrt und machst eigentlich C), dann stimmt höchstwahrscheinlich etwas nicht mit dem Design deiner Funktionen.



  • Kellerautomat schrieb:

    http://msdn.microsoft.com/en-us/library/zkwh89ks.aspx

    Wie soll mir das weiterhelfen?

    SeppJ schrieb:

    Wenn du übrigens wirklich C**++** mit Ellipsen machst (d.h. du hast dich nicht im Forum geirrt und machst eigentlich C), dann stimmt höchstwahrscheinlich etwas nicht mit dem Design deiner Funktionen.

    Du sprichst in Rätseln (aus meiner Perspektive)... 😕



  • Pfuscher schrieb:

    Du sprichst in Rätseln (aus meiner Perspektive)... 😕

    In C++ gibt es so gut wie immer bessere Alternativen als variable Argumentlisten.

    Daher: Was willst du genau erreichen?



  • Naja zunächst mal alle Argumente "auflisten", ohne va_list.
    Habe nur mal drüber nachgedacht, ob das wohl noch anders möglich bzw. gängig ist.
    Mit Assembler wäre das ja eben kein Problem, aber mit C/C++, gibts da noch was?



  • Wozu auflisten? Was soll die Funktion tun?

    Drück dich bitte etwas genauer aus.



  • Pfuscher schrieb:

    Naja zunächst mal alle Argumente "auflisten", ohne va_list.

    Genau dafür gibt es va_list doch!? va_list wird unter der Haube übrigens genau das tun, was deine "dreckige Variante" macht.

    Pfuscher schrieb:

    Habe nur mal drüber nachgedacht, ob das wohl noch anders möglich bzw. gängig ist.
    Mit Assembler wäre das ja eben kein Problem, aber mit C/C++, gibts da noch was?

    In C++ verwendet man sowas eher von vorn herein überhaupt erst gar nicht... 😉



  • dot schrieb:

    Genau dafür gibt es va_list doch!? va_list wird unter der Haube übrigens genau das tun, was deine "dreckige Variante" macht.

    Ah, wunderbar. Das habe ich eigentlich gemeint, wollte eben wissen, was da der optimale Weg ist und habe mich dabei... suboptimal ausgedrückt...

    In Ordnung, vielen Dank für eure Hilfe und entschuldigt bitte die Verwirrung 😉



  • Der optimale Weg ist, keine Funktionen mit variabler Anzahl an Argumenten zu verwenden, weil die Typsicherheit damit dahin ist.



  • dot schrieb:

    Der optimale Weg ist, keine Funktionen mit variabler Anzahl an Argumenten zu verwenden, weil die Typsicherheit damit dahin ist.

    Wenn ich Typsicherheit will, wechsel ich zu C# 🤡
    Nein Spaß bei Seite, ich werde die Funktion nur selber (nicht kommerziell :p ) benutzen und nicht exportieren o.Ä., von daher sollte das kein Problem darstellen 😉
    Davon ab, wollte ich mich nur mal generell Informieren, habe da eigentlich nichts konkretes geplant.

    Trotzdem danke!



  • Pfuscher schrieb:

    Nein Spaß bei Seite, ich werde die Funktion nur selber (nicht kommerziell :p ) benutzen und nicht exportieren o.Ä., von daher sollte das kein Problem darstellen 😉

    Das hat damit nichts zu tun.

    Du eröffnest dir damit eine unnötige Fehlerquelle, die einfach zu vermeiden wäre. Wenn du mal Nachmittage lang wegen solcher Dinge für Debugging verschwendet hast (am besten noch, weil jemand anderes den Code geschrieben hat), wirst du es schätzen, moderne C++-Techniken verwenden zu können 😉



  • Pfuscher schrieb:

    Nein Spaß bei Seite, ich werde die Funktion nur selber (nicht kommerziell :p ) benutzen und nicht exportieren o.Ä., von daher sollte das kein Problem darstellen 😉

    Das ändert aber nix dran, dass es nicht elegant ist... 😉



  • Ja ich weiß, Schande über mich, ich werde es mir merken und bei Gelegenheit umsetzen, versprochen 🤡
    Habe nie behauptet, es sei elegant so wie ich es gemacht habe. Aber schön, dass ich jetzt weiß, dass das kein anständiger Mensch so machen würde 🙂



  • Da fällt mir doch gerade nach dem Abschicken noch was ein...
    Um jetzt keine unnötigen zweiten Thread auf zu machen: Wie sähe denn eine C-Lösung aus? Da kann ich die schönen C++-Techniken ja nicht mehr verwenden...
    va_list?

    Gruß



  • Die erste Frage ist immer: Wieso überhaupt eine variable Anzahl an Parametern? Falls es wirklich ganz und gar unvermeidbar ist, dann evtl. va_list. Gibt aber z.B. auch noch variadic Macros in C...



  • Wo hast du "schöne C++ Techniken" verwendet? Ich sehe nur C.


  • Mod

    Pfuscher schrieb:

    Da fällt mir doch gerade nach dem Abschicken noch was ein...
    Um jetzt keine unnötigen zweiten Thread auf zu machen: Wie sähe denn eine C-Lösung aus? Da kann ich die schönen C++-Techniken ja nicht mehr verwenden...
    va_list?

    Gruß

    va_list ist die C-Technik! Du hast in diesem Thread an keiner Stelle C++-Technik benutzt und in C++ würde man dies auch niemals machen und würde denjenigen der das macht sofort teeren, federn und ins C-Land verbannen. Ich hatte eigentlich gehofft, dass dies nach

    SeppJ schrieb:

    Wenn du übrigens wirklich C**++** mit Ellipsen machst (d.h. du hast dich nicht im Forum geirrt und machst eigentlich C), dann stimmt höchstwahrscheinlich etwas nicht mit dem Design deiner Funktionen.

    und

    Nexus schrieb:

    In C++ gibt es so gut wie immer bessere Alternativen als variable Argumentlisten.

    und

    dot schrieb:

    In C++ verwendet man sowas eher von vorn herein überhaupt erst gar nicht... 😉

    und

    dot schrieb:

    Der optimale Weg ist, keine Funktionen mit variabler Anzahl an Argumenten zu verwenden, weil die Typsicherheit damit dahin ist.

    und

    Nexus schrieb:

    Du eröffnest dir damit eine unnötige Fehlerquelle, die einfach zu vermeiden wäre. Wenn du mal Nachmittage lang wegen solcher Dinge für Debugging verschwendet hast (am besten noch, weil jemand anderes den Code geschrieben hat), wirst du es schätzen, moderne C++-Techniken verwenden zu können 😉

    und

    dot schrieb:

    Das ändert aber nix dran, dass es nicht elegant ist... 😉

    mal so langsam rüber gekommen wäre.



  • Nathan_logoff schrieb:

    Wo hast du "schöne C++ Techniken" verwendet? Ich sehe nur C.

    Habe ich hier auch nicht verwendet, möchte ja eben Alternativen (aus reinem Interesse) wissen...

    dot schrieb:

    Die erste Frage ist immer: Wieso überhaupt eine variable Anzahl an Parametern? Falls es wirklich ganz und gar unvermeidbar ist, dann evtl. va_list. Gibt aber z.B. auch noch variadic Macros in C...

    Tja, keine Ahnung warum, weil es bequem ist, vielleicht? Wie gesagt, ich möchte es nur theoretisch wissen, es ist nicht so, dass ich plane es mit meinen oben genannten Mitteln umzusetzen... Dafür würde ich eben C++-Techniken einsetzen, welche ich aber, aufgrund von Alternativensuche, hier nicht genannt habe 😉

    @SeppJ:
    Danke für die Zusammenfassung 🤡

    Also abschließend vielleicht noch einmal zum Verständnis:
    Mir ist bewusst, dass es schöne Techniken gibt, die mein "Problem" lösen. Mir ist auch bewusst, dass ich mir damit das Leben unnötig schwer machen. Aber ich habe eben nur nach theoretischen Alternativen gesucht.

    Gruß



  • Was willst du machen?


Anmelden zum Antworten