нарушение доступа glutBitmapString - PullRequest
0 голосов
/ 28 марта 2011

(ОС: 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");

Теперь каким-то образом все это заставляет мою программу застревать в бесконечности "цикл нарушения прав доступа, который я не могу исправить.Я даже прокомментировал весь другой код отрисовки, чтобы просто вывести текст, и он все еще выдает ошибку нарушения доступа, я в недоумении, потому что, похоже, это никак не повлияет.Так у кого-нибудь есть какие-нибудь указатели;)) о том, как решить эту проблему?

Я мог бы опубликовать весь свой код отрисовки, но я даже попробовал пустой проект, так что я почти уверен, что это не остальная частьcode.

Редактировать: Я пытался еще больше сузить ошибку, и кажется, что 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 голосов
/ 28 марта 2011

glutBitmapString относится к типу const unsigned char*, а не к unsigned char*. Это поможет? У меня также были проблемы с приведением строк.

И я узнал, что я не закрывал свою строку, потому что unsigned char* должен быть на 1 длиннее string. Вот фрагмент кода, который решил его для другого метода с таким же типом параметра:

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

И тогда у вас есть char*.

0 голосов
/ 24 июня 2011

Недавно я получил ту же ошибку при попытке использовать 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, какой пожелаете.Это, а также то, что было предложено Марниксом, решило для меня ошибки исключений.

Обратите внимание, что я на самом деле не создаю окно с переизбытком.

0 голосов
/ 28 марта 2011

Попробуйте поместить строку во временную переменную. Тот факт, что вы должны разыграть, должен поднять красный флаг.

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

если const не работает, то glutBitmapString () может изменять строку.

...