Vectorは正しいデータタイプ(uint16_tの代わりにwchar_t)を保存しません
質問
ネットリーディングハイパースペクトルデータ(画像、ピクセル強度を与えている整数がたくさん)からベクトルにいくつかのコードがあります。 Linuxシステムで成功したコードを使用しましたが、Windowsシステムでも同じことが必要です。 Visual Studio 2008を使用しています。
Linuxでデータを読むと、整数でいっぱいのベクトルが得られます。 Windowsでは、整数を取得し、次にいくつかのCharまたはバイトデータを取得します。私はそれをよりよく説明するのに十分な知識がありません。
ベクトルは初期化されます
std::vector< unsigned short int > data;
data.resize( samples * lines * bands );
std::fill( data.begin(), data.end(), 0 );
関連するコードはです
for( unsigned int i=0; i < num_pixels && file; ++i ){
char number[sizeof(DataType)];
file.read( number , sizeof( DataType ) );
int l = sizeof(DataType)-1;
if (machine_endian != header.big_endian) {
for (int j = 0; j < l; j++, l--){
number[j] ^=number[l];
number[l] ^= number[j];
number[j] ^= number[l];
}
}
unsigned short temp = *((unsigned short int*)number);
data[i] = temp;
}
Machine_Endian部品は実行されません。温度は、INTに番号をキャストできるかどうかをテストするためだけです。正常に動作します。ただし、ベクトルに温度を入力すると、intだけよりも多くの情報が挿入され、wchar_tとしてリストされています。以下の画像を参照してください。私はそれがタイプサイズと関係があると思いますが、私はその理由について無知です。それは私のものですか、それとも視覚的なスタジオの断層ですか?何か案は?
解決
実際、それは正常に動作しています。 Microsoftは、検査を促進したいだけです wchar_t
値(これは short int
sおよびwindowsでutf16コード化された文字を表します)、彼らのデバッガーが表示します short int
s as wchar_t
s。それは単なる解釈の問題です。
使用していた場合 char
sデータの場合、ほぼすべてのアーキテクチャで同じ現象に遭遇します。
他のヒント
すべてが正常に動作します。WCHAR_Tがプラットフォーム上の署名されていないショートの同義語であるため、デバッガーはそこに表示する名前を知りません。また、挿入された「もっと情報」はありません。これも、MSVCデバッガーが数字を広い特徴として解釈します。
typedef struct {
unsigned short x;
unsigned short y;
unsigned short z;
} vec3_t;
std :: vectorの代わりにvec3_tを使用しました。
Windowsでは、WCHAR_Tは符号なしのショートと同じですが、UNIXでは4バイトの長さであるため、コードをポータブルにするために独自のベクトルタイプを作成する必要があります。