問題タブ [variant]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - OLE バリアントをハッシュするための推奨される実装は何ですか?
古いバージョンの Visual Basic で使用され、COM オートメーションで広く使用されている OLE バリアントは、さまざまな型を格納できます。整数や浮動小数点数などの基本的な型、文字列や配列などのより複雑な型、さらにはIDispatch
実装やポインターに至るまでです。ByRef
亜種の形。
バリアントは弱い型付けもされます。適用する演算子と、演算子に渡される値の現在の型に応じて、警告なしに値を別の型に変換します。たとえば、整数1
を含むバリアントと文字列を含むバリアントの 2 つのバリアントを比較すると"1"
、等しいかどうかが返されTrue
ます。
VARIANT
したがって、基になるデータ レベル (たとえば、C++ またはDelphi - つまり、さまざまな可能な値の大きな結合)でバリアントを扱っていると仮定するとTVarData
、正しいルールに従うようにバリアントを一貫してハッシュするにはどうすればよいでしょうか?
ルール:
- ハッシュが等しくないバリアントは、ソートと直接の等価性の両方で、等しくないものとして比較する必要があります
- ソートと直接等価の両方で等しいと比較されるバリアントは、等しいとハッシュする必要があります
ハッシュを適合させるために、異なるソート規則と直接比較規則を使用しなければならない場合でも問題ありません。
私が現在取り組んでいる方法は、バリアントを文字列に正規化し (適合する場合)、それらを文字列として扱うことです。それ以外の場合は、バリアント データを不透明なブロブであるかのように処理し、その生バイト。もちろん、これにはいくつかの制限があります。数値の1..10
並べ替え[1, 10, 2, ... 9]
などです。これはやや面倒ですが、一貫性があり、ほとんど作業はありません。ただし、この問題に対して受け入れられている慣行があるかどうかは疑問です。
datetime - VBScript には DateTime.TryParse に相当するものがありますか?
バリアントを考えると、VBScript には C# の DateTime.TryParse メソッドに相当するものがありますか?
c++ - タイプの識別
私のアプリケーションには、継承チェーンの最後にあるクラスのみが非抽象クラスである継承階層があります。また、boost::variantの使用法もあります。ポインタと型を取り、オブジェクトがその型に属しているかどうかを示す関数を書きたいと思います。
例えば
ここで、ブーストバリアントがある場合、ブーストバリアントがその特定のタイプを格納しているかどうかを調べたいと思います。誰かがそれを手伝ってくれますか?バリアントであるかどうかを確認するためにパラメータを追加したくありません。抽象性を見つけるためにも、私はboost::is_abstractを使用しています。
ありがとう、ゴクル。
c - C のバリアント データ型ライブラリ
動的に型付けされた変数 (別名バリアント)を格納および操作するための適切なオープンソース C ライブラリはありますか? 私は主にアトミック値 (int8、int16、int32、uint、string、blob など) に関心がありますが、JSON スタイルの配列とオブジェクト、およびカスタム オブジェクトもいいでしょう。このようなライブラリが役立つ主なケースは、SQL データベースの操作です。
このようなライブラリの最も明白な機能は、サポートされているすべての値の単一の型です。たとえば、次のようになります。
その他の機能には、Variant オブジェクトと C 構造体との変換 (バインディング テーブルを使用)、文字列との間の値の変換、SQLite などの既存のデータベース ライブラリとの統合が含まれます。
注: これがC のジェネリック データ型のライブラリの複製であるとは思えません。、「キュー、ツリー、マップ、リスト」を指します。私が話しているのは、SQL データベースでの作業をインタープリター言語での作業とほぼ同じくらいスムーズにすることに重点を置いています。
c++ - バリアントと bstr_t 間のキャストにより、Windows 2008 で一貫性のないクラッシュが発生する
単純な C++ ラッパー クラスを呼び出す C# アプリケーションがあり、それが既存の C++ DLL を呼び出します。C++ コードはすべて VC++ 6.0 です。
一貫性のない動作が得られますが、クラッシュが発生した場合、クラッシュは常に C++ ラッパー DLL 内で発生し、常に同じ場所で発生します (苦痛なログ ステートメントを使用して確認しました)。Windows 2008 以外の環境では発生しないため、何らかの理由で Windows 2008 がより注意を払っていることに、致命的ではないものの悪いメモリの破棄が行われていると思われます。
関連するコードは次のとおりです。これがクラッシュする理由について誰かが考えている場合は、大歓迎です。私たちは数日間頭を悩ませてきましたが、プロジェクトのタイムラインは、単純な文字列を C# に戻すことができるようにするために遅れています...
VariantInit を使用して VARIANT vresult を設定し、VariantClear を使用した後にそれをクリアしようとしたと言われましたが、それは役に立ちませんでした。
繰り返しになりますが、どんなアイデアでも大歓迎です。
delphi - Delphi でオブジェクトを OleVariant としてキャストする
OleVariant で TObject の子孫をラップしてアンラップする方法はありますか? オートメーション オブジェクト間で TObject を渡そうとしています。私はそれが良い考えではないことを知っていますが、私には良い代替手段がありません.
オブジェクトは、同じオートメーション dll からのオブジェクト間で渡されます (違いがある場合)。
このようなもの:
クライアントが次のように使用するもの
これはコンパイルに失敗し、戻ります
com - F# から Matlab の MLApp.MLAppClass.FEval を呼び出す
Matlab は、任意の関数 (およびコード スニペット) のリモート実行をサポートする COM インターフェイスを提供します。特に、特定の Matlab 関数を呼び出す Feval メソッドがあります。このメソッドの 3 番目のパラメーターである pvarArgOut は COM 型 VARIANT* を持ち、Visual Studio F# エディターでは次の型の引数として表示されます。
次のコードは interp1 を呼び出します。これは、ほとんどの Matlab 関数で通常行われているように、Matlab では行列 (つまり、2D double 配列) の結果を返します。
このコードは正常にコンパイルされますが、interp1 を呼び出すと、COM 例外が発生します。
yi を新しい obj、新しい Array2D、または null で初期化しても、同じエラーが発生します。
F# は VARIANT 出力引数をどのように変換しますか?
アップデート
修正版は次のとおりです。
c++ - boost::variant のイテレータ
やあ、
既存のコードを boost::variant に適合させようとしています。アイデアは、異種のベクターに boost::variant を使用することです。問題は、残りのコードが反復子を使用してベクトルの要素にアクセスすることです。イテレータで boost::variant を使用する方法はありますか?
私はもう試した
しかし、うまくいきませんでした。
編集:助けてくれてありがとう!しかし、私の設計では、リストから 1 つの要素を取得し、それをコードの他の部分に渡す必要があります (GSL を使用しているため、これは厄介な場合があります)。イテレータを使用するという考え方は、イテレータを関数に渡すことができ、その関数はその特定の要素からの戻りデータに対して動作するということです。for_each を使用してそれを行う方法がわかりません。私はそれに似た何かをする必要があります:
ありがとう!
c++ - VariantClear() は、SAFEARRAY を含む VARIANT で呼び出されると例外をスローします。
BYTES の配列から VARIANT にいくつかのデータをラップしようとしていますが、データを解放できないようです:
このコードを実行すると...
次のメッセージが表示されます。
ちなみに、このメッセージは私の AfxMessageBox には表示されません。設定しないと例外が発生しないため、バリアント型と関係があるようです。pBuffer 内のデータは、以前に SAFEARRAY から引き出された単なる BYTE 配列です。
誰かが私が間違っていることを知っていますか?
ありがとう
c++ - COleVariant の Null チェック
COleVariant で null チェックを実行することは可能ですか、または少なくとも型が VT_NULL に設定されているかどうかをチェックすることはできますか? ChangeType() メソッドがあることがわかりましたが、VT_NULL から VT_INT に変更すると型の不一致がスローされるため、型を変更しようとする前に、現在の型が何であるかを何らかの方法で把握できることを望んでいました。