您鏈接的代碼中的主要問題與OpenGL無關,也不涉及加載圖像。問題是,內容從文件加載的方式不可靠。這裏是
// read the width
if ((i = fread(&image->sizeX, 4, 1, file)) != 1) {
printf("Error reading width from %s.\n", filename);
return 0;
}
的問題,即sizeof(Image::sizeX)
不是neccesarily 4 「字符」:拿這個舉例來說。這種類型是unsigned long
這是至少 4但它可以更長。在現代系統中很可能是8。這意味着,8個「字符」中的4個在讀取之前就已經存在,這是通常關心的非零垃圾。
另外整個永久性問題沒有解決。實現健壯的二進制加載的唯一方法是通過從明確定義的表達式中分配明確地設置所有位。在現場的情況下Image::sizeX
你可以把它寫成
char buf[4];
// read the width
if ((i = fread(buf, 4, 1, file)) != 1) {
printf("Error reading width from %s.\n", filename);
return 0;
}
image->sizeX =
((unsigned long)buf[0]) |
(((unsigned long)buf[1])<<8) |
(((unsigned long)buf[2])<<16)|
(((unsigned long)buf[3])<<24);
寫作這種方式是一個強大的和plattform獨立的方式來讀取二進制數據唯一方式。寫作乏味嗎?是的。這就是爲什麼你會寫一些輔助函數來將它抽象出來。
雖然這將通過使用第三方庫來解決。無論如何,'+ 1'是真正的問題。 – 2013-02-16 20:15:36
@BartekBanachewicz:確實使用經過良好測試的第三方庫是推薦的方法。但指出實際問題是值得的。至於什麼圖書館使用,意見不同。同樣,在開發軟件時,你會比以後遇到一種情況,那就是你必須自己編寫一個二進制文件解析器,例如,如果你必須處理一些內部文件格式,而沒有其他人使用。 – datenwolf 2013-02-16 21:06:52