2009-02-26 47 views
1

好的。所以我想用C++編寫的文件。我用c運行了代碼,並且完全沒有問題。關於OpenGL的問題以及將C轉換爲C++的過程

因爲我不知道c,所以我使用了一些轉換軟件一段時間,但它並不奏效(猜測編碼格式不是它所需的樣式)。我決定自己嘗試一下,看起來我只需要將一些malloc語句更改爲新的語句,並用delete刪除即可。所以我運行了程序,看起來大部分功能都能正常工作,但是這給我帶來了麻煩。

當我試圖更新新圖像的顯示(我讀TIFF圖像數據,並在屏幕上顯示它)我碰上這些特定語句的問題:

glutReshapeWindow(ImageWidth,ImageLength); 
glClear(GL_COLOR_BUFFER_BIT);//these 
glRasterPos2i(0, 0);//three 
glDrawPixels(ImageWidth, ImageLength, GL_RGB, 
    GL_UNSIGNED_BYTE, ImageData);//statements are the ones giving me the error 

我包括代碼塊中的第一條語句表明它不會立即炸燬任何類型的OpenGl調用。

我一直沿着

Cannot access memory at address 0xfbad248c 
Cannot access memory at address 0xfbad248c 
Cannot access memory at address 0xaabbeeaa 

我知道這可能是有點模糊的線條收到錯誤,但是這可能是此錯誤的一些常見的來源是什麼?它在C中工作,可能導致快速切換到C++中的這個錯誤?

謝謝,讓我知道你是否需要任何更多的信息。


好了,所以我真的不使用標準的OpenGL庫,我相信(這是一類,我是由教員給出的庫文件)。我的代碼爲

#include <GL/glut.h> 

as my #include。這些庫與c文件中的庫完全一樣,因爲我只是將它們複製並粘貼到我的C++項目中。 (我還在另一個C++項目中以有限的方式與他們合作)。以防萬一,我檢查了我的文件系統中的文件「OPENGL32.DLL」和「GLU32.DLL」,但沒有找到它們。

我也許應該包括這些額外的細節:

一個init()方法在程序開始時被稱爲實際輸入循環調用之前:

void 
init(void) 
{ 
    glClearColor (0.0, 0.0, 0.0, 0.0); 
    glShadeModel(GL_FLAT); 
    makeCheckImage(); 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
} 

這種方法似乎做工精細(在函數調用後不久就會創建一個簡單的棋盤圖案)。我不確定這些類型的OpenGL文件(「OPENGL32.DLL」或「GLU32.DLL」),但希望這可以縮小問題的範圍。

至於ImageData行,我不相信ImageData對象被破壞或類似的東西,因爲你談論的一些原因以及我發佈的第一個代碼塊中的代碼(錯誤的根源)是一個else塊這樣內:

if (ImageData == NULL) {/*code*/} 
else{/*this is where the error code is*/} 

我可以張貼在Makefile的信息,如果你認爲這將是有幫助的(只是不希望這個線程弄亂用的東西,如果它的不)。

回答

1

第一條不會給出錯誤的語句是來自GLU32.DLL的命令,其他語句應該是OPENGL32.DLL命令。檢查你是否正確鏈接了庫並嘗試複製程序目錄中的DLL。

最後一行也可能與您的ImageData有一些錯誤,但由於您說它在C中工作,並且您只用new/delete替換了malloc/free,所以出現錯誤的可能性不大,無論如何,您應該檢查它,太。可能會讀取整個ImageData數組而不涉及OpenGL調用。順便說一下,我希望ImageLength不是完整圖像文件的長度,而是圖像的高度。

編輯:好吧,所以它似乎有點不同。你發佈的init函數似乎可以訪問其他gl函數,所以你的函數庫可以工作。順便說一句,有趣的是你找不到DLL。它們通常存儲在Windows \ System32路徑中。

「if(ImageData == NULL)」是第一步,但您也應該嘗試讀取所有ImageWidth * ImageLength條目以進行調試,也許您分配了錯誤的字節數。

崩潰的另一個原因可能是您使用的頭文件不是最新的並且與您的調用或DLL不兼容。

如果所有這些都不能解決您的問題,發佈makefile確實會很有用。

+0

我回復了一個編輯。 – Chad 2009-02-26 10:20:09

2

我不知道該怎麼經歷過,你是用C和C++之間的差異,所以我不想光顧你,但它值得一試:

你用

unsigned char* data = new unsigned char[size]; //correct 
//.... 
delete[] data; 

(數組分配) 或

unsigned char* data new unsigned char(size); //wrong 
//.... 
delete data; 

(分配有值大小的單個字符)

爲您的圖像數據?