Вектор не будет хранить правильный тип данных (wchar_t вместо uint16_t) - PullRequest
1 голос
/ 20 октября 2011

У меня есть некоторый код из сети, считывающий гиперспектральные данные (изображения, так много целых чисел, дающих интенсивность пикселей) в вектор. Я успешно использовал код в системе Linux, но теперь мне нужно то же самое в системе Windows. Я использую Visual Studio 2008.

Читая данные в Linux, я получаю вектор, полный целых чисел. На окнах я получаю целые числа, а затем некоторые символы или байтовые данные. Я не знаю достаточно, чтобы описать это лучше.

Вектор инициализируется как

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 - просто проверить, могу ли я привести число к целому числу. Работает нормально. Тем не менее, когда я помещаю temp в вектор, там вставляется больше информации, чем просто int, и она указывается как wchar_t. Смотрите изображение ниже. Я думаю, это связано с размером шрифта, но я не знаю, почему. Это моя или Visual Studios вина? Есть идеи?

Ответы [ 3 ]

1 голос
/ 20 октября 2011

На самом деле работает нормально.Microsoft просто хочет облегчить проверку значений wchar_t (которые являются short int с и представляют собой символы в кодировке utf16 на окнах), поэтому их отладчик показывает short int с как wchar_t с.Это просто вопрос интерпретации.

Если бы вы использовали char s для своих данных, вы бы столкнулись с таким же явлением практически в любой архитектуре.

0 голосов
/ 20 октября 2011

Все отлично работает, просто wchar_t является синонимом unsigned short на вашей платформе, и поэтому отладчик не знает, какое имя отображать там. Также не вставлено никакой «дополнительной информации». Это снова отладчик MSVC интерпретирует число как широкий символ.

0 голосов
/ 20 октября 2011
typedef struct {
    unsigned short x;
    unsigned short y;
    unsigned short z;
} vec3_t;

и использовал vec3_t вместо std :: vector.

В Windows wchar_t - это то же самое, что и unsigned short, а в Unix - 4 байта, поэтому вы должны создать свой собственный векторный тип, чтобы сделать ваш код переносимым.

...