1

Variantにfloat値があります。最初、このバリアントはbstrタイプです。VariantChangeTypeを使用してfloatタイプに変更しています。それから私はそれからfloat値を取得し、それから私はバイトベクトル形式に変換しています。

バリアントにfloat値がある場合、これは正常に機能します。バリアントにINF値がある場合、VariantChangeTypeは失敗します。だから私はvariant.fltValから0を取得しています。

バリアントがINFまたはNAN値を持つ場合、タイプをフロートに変更するにはどうすればよいですか?floatでINFまたはNAN値を取得したい。

Convert(_variant_t varVal,vector<byte> dataArr)
{
    HRESULT hr = VariantChangeType( varVal&, &varVal, 0 , VT_R4 ); 

   // Above code is failing if varVal.bstr contains 1.#INF" values 

    UINT size = 4;
    if ( data && dataItem.vt != VT_EMPTY )
    {
     float value = dataItem.fltVal;
     BYTE tmpBuf[4];
     memcpy(tmpBuf, &value, sizeof(value));
     for( int i = size - 1 ; i >= 0 ; i-- )
     {    
         data->push_back(tmpBuf[i]);
     }    
     retVal = TRUE;
   }
}
4

1 に答える 1

3

疑似言語で:

 if ( varVal.bstr.contains("1.#INF" ) ) {
   // assign plus infinity to your variant see http://stackoverflow.com/questions/2538339/infinity-in-msvc 
 } else if ( varVal.bstr.contains("-1.#INF" ) ) {
   // assign minus infinity to your variant see http://stackoverflow.com/questions/2538339/infinity-in-msvc 
 } else if ( varVal.bstr.contains("NaN" ) {
   // assign NaN to your variant see http://stackoverflow.com/questions/235386/using-nan-in-c
 } else {
   // your original working code for regular float values
 }

これは壊れやすいソリューションであるため、注意してください。無限大とNaNの文字列表現に依存しており、Microsoftが警告なしにそれらを変更できる可能性があります。

これは、Raymond Chenによる非公式でありながら信頼できる情報 です。-1。#INDとはどういう意味ですか?:Visual Cランタイムライブラリが、に関連していない場合でも、特別な浮動小数点値を出力する方法の調査VARIANT

出力の意味
1#INF正の無限大
-1#INF負の無限大
1#SNANポジティブシグナリングNaN
-1#SNANネガティブシグナリングNaN
1#QNANポジティブクワイエットNaN
-1#QNANネガティブクワイエットNaN
1#IND正の不定代名詞
-1#IND負の不定NaN

公式情報はprintfTypeFieldCharactersです。

于 2011-02-19T17:03:47.460 に答える