2017-01-03 3 views
0

でコンパイルした場合にのみ、::ビットセットをSTDを使用して、私はバイナリコードと背中に文字列を変換する簡単なプログラムに取り組んでいたとき。プログラムがクラッシュしたが、VC 2015

:次の関数を呼び出すときに、私は

bitset<N> char 

ようなものでUbuntuの上で作業して、Linuxのビルドが正常に動作しながらのVisual Studio 2015とWindows上でプログラムをコンパイルしたい、Windows上でそれをコンパイルしますが、クラッシュしています

bool bin2string(std::string *psBinaryString, std::string *psCharakterString) 
{ 
psCharakterString->clear(); 
char cTempArray[8]; 
char cTemp; 

for(unsigned int i = 0; i < psBinaryString->length(); i += 8) 
{ 
    for(unsigned int j = 0; j < 8; ++j) 
    { 
     cTempArray[j] = psBinaryString->c_str()[j + i]; 
    } 
    std::bitset<8> Bitset(cTempArray); 
    cTemp = static_cast<char>(Bitset.to_ulong()); 
    psCharakterString->push_back(cTemp); 
} 
return true; 
} 
さて、私の質問は、このコードで何が間違っている、ありますか?なぜそれはLinux(gcc)とWindows(MinGW)でも動作しますが、WindowsではVisual Studio 2015で動作しません。このため

私の現在のworkarroundは次のようになります。これら二つの解決策の一つが優れている

#ifdef _WIN32 

bool bin2string(std::string *psBinaryString, std::string  *psCharakterString) 
{ 
psCharakterString->clear(); 
char cTempArray[8]; 
char cTemp; 

for(size_t i = 0; i < psBinaryString->length(); i += 8) 
{ 
    for(size_t j = 0; j < 8; ++j) 
    { 
     cTempArray[j] = psBinaryString->c_str()[j + i]; 
    } 
    cTemp = static_cast<char>(strtol(cTempArray, 0, 2)); 
    psCharakterString->push_back(cTemp); 
} 
return true; 
} 

#else 

bool bin2string(std::string *psBinaryString, std::string *psCharakterString) 
{ 
psCharakterString->clear(); 
char cTempArray[8]; 
char cTemp; 

for(unsigned int i = 0; i < psBinaryString->length(); i += 8) 
{ 
    for(unsigned int j = 0; j < 8; ++j) 
    { 
     cTempArray[j] = psBinaryString->c_str()[j + i]; 
    } 
    std::bitset<8> Bitset(cTempArray); 
    cTemp = static_cast<char>(Bitset.to_ulong()); 
    psCharakterString->push_back(cTemp); 
} 
return true; 
} 

#endif 

+2

あなたは "クラッシュ" とはどういう意味ですか?実際に何が起こるのですか? –

+4

ドキュメントによると、http://en.cppreference.com/w/cpp/utility/bitset/bitset bitsetのコンストラクタでは、配列の長さが指定されていない場合、NULLで終了する文字列が必要です。あなたはLinux上で動作するのは幸いです。 – Frank

+0

@Frank答えは以下の通りです。 – NathanOliver

答えて

4

あなたのクラッシュがのstd ::ビットセットのコンストラクタは、配列の長さ、またはnullで終わる文字列のいずれかを期待していることに起因します。

あなたが使用する必要がありますので

http://en.cppreference.com/w/cpp/utility/bitset/bitsetのドキュメントを参照してください):

std::bitset<8> Bitset(cTempArray, 8); 
関連する問題