Rückgabe Variant



  • Hi

    Ich habe da so meine Probleme mit dem typ VARIANT.

    Und zwar habe ich hier mal als Beispiel eine kleine Funktion die einen double ein einen Variant werd wandeln soll

    static VARIANT Convert2Variant(double value)
    {
    	VARIANT variant;
    
    	variant.dblVal = value;
    	variant.vt = VT_R8;
    
    	return variant;
    }
    

    Nun folgende fragen dazu

    1. Muss ich VariantInit aufrufen?
    2. wenn ja muss ich ja auch wieder VariantClear aufrufen. Aber wo, ich kann ja nicht vorher Clear aufrufen und dann return.
    3. Was passiert wenn ich einen VARIANT zurückgebe, der wird ja dann einfach kopiert. Einen Variant muss man doch mit VariantCopy kopiren.

    Kann mir da jemand helfen?



  • Es gibt keinen Datentyp VARIANT in Standard C++.



  • 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.


Anmelden zum Antworten