Rückgabe Variant



  • manni66 schrieb:

    Es gibt keinen Datentyp VARIANT in Standard C++.

    Fang deswegen nicht an zu weinen...



  • Aber keiner weiß nun, was er meint, da wir alle die Klasse nicht kennen.



  • Ich wusste nach circa einer Minute dass es sich um den Datentyp der WinAPI handelt der auf der entsprechenden Website sehr genau dokumentiert ist. Was soll das?



  • Hallo

    Entschuldigung. Kann das jemand in das WinApi Unterforum verschieben.



  • Arcoth schrieb:

    Was soll das?

    Standartisierte Antworten auf nicht standartengerechte Fragen im Standartforum?



  • Dieser Thread wurde von Moderator/in Arcoth aus dem Forum C++ (alle ISO-Standards) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Standard schreibt man mit d. Auch wenn man es 3 mal falsch schreibt wird es nicht besser.



  • Arcoth schrieb:

    Ich wusste nach circa einer Minute dass es sich um den Datentyp der WinAPI handelt der auf der entsprechenden Website sehr genau dokumentiert ist. Was soll das?

    Ich wusste es nicht.



  • 🙄

    Nochmals Entschuldigung dass ich im falschen Unterforum gelandet bin.

    Vieleicht könnte man auch ein Unterforum aufmachen in dem man über falsche Forumseinträge diskutieren kann. Einfach das Thema dort reinkopieren. Wem es dann Spaß mach sich seinen Tag so zu vertreiben, bitte.

    Vieleicht hier nochmals höfflichst die Frage:

    Kann mir jemand zu meiner Eingangsfrage helfen?



  • Aus der Dokumentation zu VariantInit bzw. VariantClear entnehme ich, dass Du nichts weiter tun musst, solange Du einen Doublewert in Deiner VARIANT-Variable aufbewahrst.
    Du kannst die Variable einfach per Zuweisung kopieren, oder wie in Deinem Fall durch Rückgabe als Funktionswert.



  • Da laut Doku VariantInit() bloß VARIANT::vt auf VT_EMPTY setzt, du VARIANT::vt aber eh gleich für deine Bedürfnisse änderst, glaube ich nicht, daß du die Funktion aufruffen musst.



  • meinard schrieb:

    3. Was passiert wenn ich einen VARIANT zurückgebe

    Einen VARIANT kannst du nicht zurückgeben, das ist unmöglich. Lern Grundlagen.



  • Einen VARIANT kannst du nicht zurückgeben, das ist unmöglich. Lern Grundlagen.

    Wieso ist das unmöglich mache ich doch in dem Beispiel und funktioniert ja auch.



  • Das machst du nicht. Wenn es funktioniert, dann zufällig. Beachte, dass IMMER (bei x86) eax den Rückgabewert enthält. eax ist 4 Bytes groß, VARIANT ist deutlich größer.



  • So ein Blödsinn!
    Dann kann man wohl auch keinen double zurückgeben, geschweige denn Instanzen von beliebigen Klassen?



  • ach wie [d|t]rollig 🙄



  • Nochmals die Frage

    Wann muss man VariantInit aufrufen und wann VariantClear.
    Wass passiert wenn ich einen Variant kopiere sei es mit dem Zuweisungsoperator oder VariantCopy

    muss ich dann VariantClear auf auf den SourceVariant sowie auf den DestVariant VariantClear aufrufen.



  • Wass passiert wenn ich einen Variant kopiere sei es mit dem Zuweisungsoperator oder VariantCopy muss ich dann VariantClear auf auf den SourceVariant sowie auf den DestVariant VariantClear aufrufen.

    VariantCopy -> 2mal VariantClear, sonst eventuell memory leak
    einfache Zuweisung -> nur einmal, sonst eventuell undefined behaviour / Crash

    Das hängt aber auch davon ab, was in dem Variant drin steckt.
    Bei trivialen Sachen wie double, float, int, ... kann man auch einfach zuweisen und niemals VariantClear oder VariantCopy verwenden. Wenn in dem Variant Strings (VT_BSTR) oder Arrays oder so drin sind oder man nichts genaues weiss, dann sollte besser man VariantCopy usw. verwenden. Oder eben selbst den Speicher korrekt handeln.

    Wann muss man VariantInit aufrufen und wann VariantClear.

    VariantInit setzt den Variant auf empty. Ansonsten kann VariantClear crashen. (Statt VariantInit den vt manuell setzen reicht auch aus). Ansonsten siehe oben. Muss man nie verwenden. Aber bei nicht trivialem Inhalt ist VariantClear (und VariantCopy) praktisch.

    P.S.: In C++ sollte man am besten einen Wrapper um den Variant verwenden. Sowas wie COleVariant.



  • Du brauchst die ...Init / ...Clear - Funktionen frühestens dann, wenn Deine Variable irgendeinen Pointer beherbergt. Solange Du da einen double - Wert drin aufbewahrst, kannst Du Deine VARIANT - Variable behandeln, wie jede andere auch!



  • Hallo _cu hallo Belli, danke für eure konkrete Hilfe

    Meine Variants beinhalten ausser int, double, float, auch BStr.
    Der macht mir dann auch am meisten Sorgen.

    Um auf Nummer sicher zu gehen würde ich am liebesten immer VariantCopy verwenden.
    Mein Problem ist hier aber der Rückgabewert.

    Wenn ich einen VARIANT zurückgebe ist dies eine Kopie ohne VariantCopy

    Hier nochmals ein Beispiel mit CString

    virtual VARIANT GetVariantValue() const
    {
    VARIANT variant;
    VariantInit(&variant);

    variant.vt = m_varianttype;
    CString csvalue = Value;
    variant.bstrVal = csvalue.AllocSysString();

    return variant;
    }

    Wann muss ich hier VariantClear aufrufen?


Anmelden zum Antworten