1

ハイパースペクトルデータ(画像、ピクセル強度を与える多くの整数)をベクトルに読み取るネットからのコードがあります。Linux システムでコードを使用して成功しましたが、Windows システムでも同じコードが必要です。Visual Studio 2008 を使用しています。

Linux でデータを読み取ると、整数でいっぱいのベクトルが得られます。Windowsでは、整数を取得してから、いくつかの文字またはバイトデータを取得します。私はそれをよりよく説明するのに十分な知識がありません。

ベクトルは次のように初期化されます。

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 部分は実行されません。temp は、数値を int にキャストできるかどうかをテストするためのものです。それは正常に動作します。ただし、temp をベクターに入れると、int だけでなく、より多くの情報が挿入され、wchar_t としてリストされます。下の画像を参照してください。文字サイズと関係があると思いますが、その理由はわかりません。それは私のせいですか、それともVisual Studioのせいですか? 何か案は?

4

3 に答える 3

1

実際、それはうまく機能しています。wchar_tMicrosoft は、値 ( short ints であり、Windows で utf16 コード化された文字を表す) の検査を容易にしたいだけなので、デバッガーはshort ints を s として表示しますwchar_t。あくまで解釈の問題です。

データに s を使用した場合char、ほぼすべてのアーキテクチャで同じ現象が発生します。

于 2011-10-20T12:51:02.620 に答える
0

すべて正常に動作しますが、wchar_t はプラットフォームで unsigned short の同義語であるため、デバッガーはそこに表示する名前を認識していません。また、挿入された「詳細情報」はありません。ここでも、MSVC デバッガーが数値をワイド文字として解釈します。

于 2011-10-20T12:47:39.997 に答える
0
typedef struct {
    unsigned short x;
    unsigned short y;
    unsigned short z;
} vec3_t;

std::vector の代わりに vec3_t を使用しました。

Windows では wchar_t は unsigned short と同じですが、Unix では 4 バイト長なので、コードを移植可能にするために独自のベクトル型を作成する必要があります。

于 2011-10-20T12:45:07.330 に答える