Запрещенная команда при программировании C++ на Linux

Моя программа, которая делает точно то же самое каждый раз, когда это работает (перемещает спрайт точки в расстояние) случайным образом перестанет работать с текстом на терминальной 'Запрещенной команде'. Мой поиск с помощью Google нашел людей, встречающихся с этим при записи блока, который имеет смысл, потому что блок бросает те виды ошибок.

Но почему был бы g ++ действительно ли генерирующий быть запрещенной командой как это? Это не похоже, я компилирую для Windows, затем работающего на Linux (который даже затем, пока оба находятся на x86, не был должен AFAIK вызывать Запрещенную команду). Я отправлю основной файл ниже.

Я не могу надежно воспроизвести ошибку. Хотя, если я вношу случайные изменения (добавляют пространство здесь, измените константу там), которые вызывают перекомпилировать, я могу получить двоичный файл, который перестанет работать с Запрещенной командой каждый раз, когда она выполняется, пока я не пытаюсь установить точку останова, которая делает запрещенную команду 'dissapear'.:(

#include <stdio.h>
#include <stdlib.h> 
#include <GL/gl.h>
#include <GL/glu.h>

#include <SDL/SDL.h>

#include "Screen.h"  //Simple SDL wrapper
#include "Textures.h" //Simple OpenGL texture wrapper 
#include "PointSprites.h" //Simple point sprites wrapper


double counter = 0;
/* Here goes our drawing code */
int drawGLScene()
{
    /* These are to calculate our fps */
    static GLint T0     = 0;
    static GLint Frames = 0;

    /* Move Left 1.5 Units And Into The Screen 6.0 */
    glLoadIdentity();
 glTranslatef(0.0f, 0.0f, -6);
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

 glEnable(GL_POINT_SPRITE_ARB);
 glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);
    glBegin( GL_POINTS );   /* Drawing Using Triangles */
 glVertex3d(0.0,0.0, 0);
 glVertex3d(1.0,0.0, 0);
 glVertex3d(1.0,1.0, counter);
 glVertex3d(0.0,1.0, 0);
    glEnd( );                           /* Finished Drawing The Triangle */

    /* Move Right 3 Units */


    /* Draw it to the screen */

    SDL_GL_SwapBuffers( );
    /* Gather our frames per second */
    Frames++;
    {
 GLint t = SDL_GetTicks();
 if (t - T0 >= 50) {
     GLfloat seconds = (t - T0) / 1000.0;
     GLfloat fps = Frames / seconds;
     printf("%d frames in %g seconds = %g FPS\n", Frames, seconds, fps);
     T0 = t;
     Frames = 0;
  counter -= .1;
 }
    }

    return 1;
}

GLuint objectID;
int main( int argc, char **argv )
{
 Screen screen;
 screen.init();
 screen.resize(800,600);


 LoadBMP("./dist/Debug/GNU-Linux-x86/particle.bmp");
 InitPointSprites();


 while(true){drawGLScene();} 
}
5
задан Robert Harvey 20 February 2013 в 20:10
поделиться

1 ответ

Компилятор не генерирует недопустимые исключения с вероятностью 99,99%. Почти наверняка происходит то, что у вас есть ошибка в вашей программе, из-за которой она либо а) перезаписывает части вашего исполняемого кода данными мусора, либо б) использует указатель функции, указывающий на мусор. Попробуйте запустить вашу программу под valgrind, чтобы диагностировать проблему - http://valgrind.org/ .

18
ответ дан 18 December 2019 в 09:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: