glutBitmapString访问冲突

时间:2011-03-28 14:34:52

标签: c++ opengl glut access-violation

(操作系统:Windows 7,编译器:Visual Studio 2010 C ++编译器)

我有一个正确工作的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);

3 个答案:

答案 0 :(得分: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 :(得分: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建议的解决了我的异常错误。

请注意,我实际上并没有创建一个过剩的窗口。

答案 2 :(得分:-1)

尝试将字符串放在临时变量中。你必须施放的事实应该引起一个红旗。

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

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