Programım her seferinde aynı şeyi yapar (bir nokta hareketini mesafeye taşır), 'Yasa Dışı Talimat' terminalindeki metinle rasgele başarısız olur. Amacım, montajı yazarken insanların bu tür karşılaşmalarla karşılaştıklarını fark etti.Linux'ta C++ Programlamaya Yönelik Yasa Dışı Talimat
Fakat neden g ++ böyle yasadışı bir talimat üretiyor? Windows için derlediğimden daha sonra Linux üzerinde çalışmam gibi değil (ki o zaman bile, her ikisi de x86'da olduğu sürece AFAIK'ın Yasa Dışı Talimat vermemesi gerekir). Aşağıdaki ana dosyayı göndereceğim.
Hatayı güvenilir şekilde yeniden oluşturamıyorum. Rastgele değişiklikler yaparsam (burada bir boşluk ekleyin, burada bir değişmez) bir derlemeyi zorladığım halde, her seferinde Yasa Dışı Talimatla başarısız olan bir ikili alabilirim. yasadışı talimat 'kaybolur'. :(
#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();}
}
Hatalı bellek modüllerini değiştirmenizi öneririm. – avakar
Hatalı yorum yazarını değiştirmeyi öneririm. –
Kodunuzu gdb altında çalıştırın ve sonra istisna yaptığınızda bir backtrace (bt) yapın. –