2016-02-19 64 views
-1

像素時是含有3個字符的結構。 struct Pixel { char r, g, b} ;「呼叫沒有匹配函數」試圖cin.read成一個二維數組

int H = 5, C = 10; 
Pixel *PMatrix[H]; // Creates an array of pointers to pixels 
for (int h = 0 ; r < H ; h++) { 
    PMatrix[r] = new Pixel[C]; //Each row points to an array of pixels 
} 

我有一個PPM文件,我想讀取字節到我的像素矩陣圖像表示,逐行。

for (unsigned int i = 0; i < height; i++){ 
    cin.read(PMatrix[i][0], width*3); 
} 

我也試過"cin.read(PMatrix[i], width*3);"在循環中。

我得到的錯誤no matching function for call to 'std::basic_istream<char>::read(PpmImage::Pixel&, unsigned int)'

這是什麼意思???

+0

無關使用數組,什麼都做,試圖傳遞一個用戶定義類型('Pixel')。 'read'可能不適合你。 http://www.cplusplus.com/reference/istream/istream/read/ – kfsone

+0

它應該是'&PMatrix [I] [0]'或'只是PMatrix [I]'某些'的reinterpret_cast在'拋出。但我猜測它仍然會在運行時失敗(因爲對齊?) – LogicStuff

回答

0

的錯誤是,你必須創建一個類,你把它傳遞給不具有過載爲它的標準庫函數。 PMatrixPixel*[],因此使用[]一旦得到一個Pixel*,再次給人以Pixelcin.read不知道Pixel的任何信息,並且沒有操作員來處理它。

通常情況下,人們會超載operator>>爲他們的階級和istream

std::istream& operator>>(std::istream& lhs, Pixel& rhs) 
{ 
    lhs >> rhs.r >> rhs.g >> rhs.b; 
    return lhs; 
} 

//... 

cin >> PMatrix[i][0]; //calls our overloaded operator 

我不知道,但我想你可能一直在試圖做到這一點:

cin.read(reinterpret_cast<char*>(PMatrix[i]), 3); //ew magic number 

由於Pixel是一個POD類型,你可以將它轉換爲一個指向第一個元素。這會讀取三個char s並將它們存儲到PMatrix[i][0]中。不過,我建議使用第一種方法。它更習慣,看起來不那麼不穩定。

+0

但是,如何添加數組指向的其他像素?爲什麼我不能'cin.read(reinterpret_cast (PMatrix [i]),5 * 3);'一次讀入5個像素? – user

+0

@user使用嵌套循環遍歷該數組。該結構可以在rgb之後具有打包字節。只有3個字節是數據時,您的像素可能是4個字節。 –

相關問題