2011-05-02 103 views
1

我試圖將在這裏找到的C openGL紋理加載代碼移植到C++中: http://www.nullterminator.net/gltexture.html 。特別是我想對付從文件中讀取一些紋理,什麼是一個地道和便攜的方式重寫下面的代碼的最佳方式:BYTE C宏的C++替換

GLuint texture; 
int width = 256, height = 256; 
BYTE * data; 
FILE * file; 

// open texture data 
file = fopen(filename, "rb"); 
if (file == NULL) return 0; 

// allocate buffer 
data = malloc(width * height * 3); 

// read texture data 
fread(data, width * height * 3, 1, file); 
fclose(file); 

特別的是替換的最好方式以可移植的C++方式使用BYTE宏?

編輯:BYTE宏沒有在我工作的當前環境中定義。我試圖弄清楚這是在其他系統上的底層類型,以便我可以typedef爲正確的類型。

+2

什麼是宏擴展到?你爲什麼不能使用它?從它的BYTE *的外觀來看,它只是char *或unsigned char * – 2011-05-02 11:06:22

+0

在這個特定的系統上,好像BYTE沒有被定義。另外,我寧願不要將代碼保留原樣,因爲我們試圖保持一種專門用於C++的編碼標準。 – shuttle87 2011-05-02 11:17:09

回答

2

C代碼編譯爲C++時應該工作得很好。

不是使用​​類型,而是使用OpenGL定義的類型GLbyte,這是API採取的實際類型。它在gl.h這樣定義:

typedef signed char GLbyte; 

一個非常快的(未經測試!)上面的代碼翻譯成C++會是這樣的:

GLuint texture; 
unsigned width = 256, height = 256; 
unsigned buffer_size = width * height * 3; 
GLbyte * data; 
std::ifstream file; 

// open texture data 
file.open(filename, ios_base::in | ios_base::binary); 
if (!file) return 0; 

// allocate buffer 
data = new BYTE[buffer_size]; 

// read texture data 
file.read(data, buffer_size); 
file.close(); 

// Process data... 
// ... 

// Don't forget to release it when you're done! 
delete [] data; 
+0

好啊,GLbyte看起來正是我需要的東西! – shuttle87 2011-05-02 11:26:19

+0

幾個清理工作幾乎可以工作,但它會導致以下編譯器錯誤:'錯誤:從'GLbyte *'無效轉換爲'std :: basic_istream :: char_type *'[-fpermissive]'。這是來自'file.read(data,buffer_size)'這一行;' – shuttle87 2011-05-02 12:11:20

+0

這很可能是一個簽名/未簽名的問題。在這種情況下,您可以添加一個強制轉換來安靜編譯器,因爲您將它視爲一個二進制數據塊。在C++中,我認爲'static_cast (data)'會更習慣用法。 – gavinb 2011-05-02 12:48:29

0

BYTE *在這種情況下似乎只是char *或unsigned char *的宏。我可能是錯的,但我懷疑它。所以在你的程序中使用char *或unsigned char *將是等價的。但是,如果您要從C移植到C++,則可能需要考慮從C++標準庫中使用ifstream(以二進制模式)。

0

使用unsigned char而不是​​- 應該按預期工作(你可能投的malloc()返回值

3

假設原來的代碼是可移植的,你可以把它只要確保你的拉。的​​的定義是,C++編譯器到C向後兼容,所以相應的頭文件仍然存在。

(如果​​真的是一個宏,我想也許typedef它。)

+0

在這個系統上沒有定義BYTE。 – shuttle87 2011-05-02 11:15:35

+0

因此,獲取舊系統的定義,看看你是否可以整合它。如果你不想破壞任何代碼,你需要在這裏設置相同的設置。 – 2011-05-02 11:17:30