2011-03-28 116 views
0

(操作系統:Windows 7,編譯器:Visual Studio 2010的C++編譯器)glutBitmapString訪問衝突

我已經得到了一些繪製球體和車型正常工作的OpenGL程序,應用一些着色器等等。等等。

現在,我認爲這將是很好添加一些文字,所以我增加了以下三行到我的繪製方法:

glColor3f(0.5f, 0.5f, 0.5f); 
glRasterPos2f(0, 0); 
glutBitmapString(GLUT_BITMAP_HELVETICA_12, (unsigned char*)"some text"); 

現在不知何故這一切都使我的程序陷入無限「訪問衝突」循環,我似乎無法修復。我甚至評論了所有其他的繪製代碼,只是輸出文本,它仍然給出訪問衝突錯誤,我在這裏是一個損失,因爲沒有任何東西似乎影響到這一點。那麼是否有人有一些指針;)如何解決這個問題?

我可以發佈我所有的繪圖代碼,但我甚至嘗試過一個空的項目,所以我很確定它不是代碼的其餘部分。

編輯:我試圖縮小更多的錯誤,似乎glRasterPos2f拋出違反(足夠奇怪)。它不在任何glBegin和glEnd調用之間,並且沒有OpenGL錯誤。

EDIT2:一些建議我嘗試下面的代碼後,我擺脫了訪問衝突,但仍然顯示

glColor3f(0.5f, 0.5f, 0.5f); 
glRasterPos2f(0.0f, 0.0f); 
std::string str("Hello World"); 
char* p = new char[strlen(str.c_str() + 1)]; 
strcpy(p, str.c_str()); 
glutBitmapString(GLUT_BITMAP_HELVETICA_12, (const unsigned char*)p); 
+0

我只是猜測,但它可能是,在VC++ 2010中,像WCHAR *類型的「一些文本」字符串文字?如果是這樣,它將與GLUT不兼容。第二個代碼看起來非常奇怪,爲什麼動態分配的char * p?我只是使用了STL std :: string :: c_str()函數。 – datenwolf 2011-03-28 15:59:54

+0

我也嘗試過直接使用c_str(),但沒有效果。如果你問我這是一個非常奇怪的問題,並且可能確實有一些與VC++ 2010編譯器相關的問題,我現在要在Linux機器上嘗試G ++,看看是否有幫助。 – 2011-03-29 07:29:43

回答

0

glutBitmapString的類型是const unsigned char*而不是unsigned char*。這會有幫助嗎?我也有串鑄造的問題。

我發現,我沒有關閉我的字符串,因爲unsigned char*應該比string長1。這裏是一個片段,用相同的參數類型解決它的另一種方法:

string fullPath = TextureManager::s_sTEXTUREFOLDER + filename; 
char *filePath = new char[strlen(fullPath.c_str())+1]; 
strcpy(filePath,fullPath.c_str()); 

然後你有你的char*

-1

嘗試把字符串中的一個臨時變量沒有文字。你必須演員的事實應該會引起一片紅旗。

glColor3f(0.5f, 0.5f, 0.5f); 
glRasterPos2f(0, 0); 
unsigned char* s = "some text"; 
glutBitmapString(GLUT_BITMAP_HELVETICA_12, s); 

如果const不起作用,那麼glutBitmapString()可能會修改字符串。

+0

像「一些文本」這樣的字符串文字總是爲const char char *,所以我必須將它們轉換爲const unsigned char *來使用它們。 (在C中,你的方法可能會起作用)。 – 2011-03-28 14:42:33

0

我最近嘗試使用glBitmapString()時遇到了同樣的錯誤。我正在使用vs2008。我在函數調用中設置了一個斷點並加入了它(使用freeglut_font.c)。在內部,我注意到這個異常是在被描述爲沒有被初始化的情況下引發的。所以,我的初始化函數裏面我加...

char* argv[] = {"some","stuff"}; int argc=2; 
glutInit(&argc,argv); 
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); 
glutInitWindowPosition(100,100); 
glutInitWindowSize(800,600); 

在哪裏,當然你可以使用任何的argc/argv的你請。這,以及Marnix提出的建議爲我解決了異常錯誤。

請注意,我實際上並沒有創建一個有過剩的窗口。