2011-10-20 20 views
1

我有一些代碼從淨讀取高光譜數據(圖像,所以許多整數給像素強度)成一個向量。我在Linux系統上使用了成功的代碼,但現在我需要在Windows系統上使用相同的代碼。我使用Visual Studio 2008.向量將不會存儲正確的數據類型(wchar_t,而不是uint16_t)

在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 Studios的錯?有任何想法嗎?

+2

'wchar_t'被定義爲'unsigned short'(如果它不是直接定義爲它,它是兩個字節並且行爲方式相同),所以它只是typename顯示問題。數字是否正確(不論類型)? –

+0

感謝您的回覆!好的,這個清理了一下。不幸的是,我現在無法檢查某些數字,但我沒有理由認爲它們不正確(合理的價值)。如果這非常重要,我可以嘗試獲取這些值,但這有點工作量。但是如何將它們在temp變量中保存得很好,然後在使用相同數據類型初始化時在vector中獲取額外數據? – SveinT

+0

對不起,英文不是我的第一語言,我不明白「但是如何將它們在temp變量中保存得很好,然後在使用相同數據類型初始化時在vector中獲取額外數據?你能重述一下這個問題嗎? –

回答

1

其實它工作的很好。微軟只是想方便檢查wchar_t值(它們是short int s,並代表windows上的utf16編碼字符),所以它們的調試器顯示short int s爲wchar_t s。這只是一個解釋問題。

如果您已經使用char作爲您的數據,幾乎在任何架構上都會遇到同樣的現象。

+0

謝謝。那麼我可能會遇到其他一些問題,因爲該矢量在一段時間後不會填充。所以我想我有一個數據問題,應該檢查數字是否正確。這只是奇怪,它在Linux上正常工作。但int後面的那些額外字符在哪裏呢?內存中的隨機碎片?編輯:沒關係,我猜L後的部分是角色...?應該想到之前,再次感謝! – SveinT

+0

's /和表示/並且可以表示/'對於自動管理數組'T [N]'的數據類型的數據類型'T'沒有什麼不可思議的' –

0
typedef struct { 
    unsigned short x; 
    unsigned short y; 
    unsigned short z; 
} vec3_t; 

和vec3_t用來代替的std ::向量。

在Windows中,wchar_t與unsigned short相同,而在Unix中它的長度爲4個字節,因此您應該創建自己的矢量類型以使代碼具有可移植性。

+0

在UNIX中,它沒有指定多長時間(儘管4個字節確實傾向於遵循語言環境的要求)。 –

0

一切工作正常,它只是,wchar_t是您的平臺上的無符號短的同義詞,因此調試器不知道在那裏顯示什麼名稱。也沒有插入「更多信息」。這又是MSVC調試器將該數字解釋爲寬字符。

相關問題