Mein Programm, das jedes Mal, wenn es ausgeführt wird, genau dasselbe tut (verschiebt ein Punkt-Sprite in die Ferne), wird zufällig mit dem Text auf dem Terminal 'Illegal Instruction' fehlschlagen. Mein Googeln hat Leute gefunden, die dies beim Schreiben von Assembly kennen, was Sinn macht, weil die Assembly diese Art von Fehlern auslöst.Unzulässiger Befehl beim Programmieren von C++ unter Linux
Aber wieso würde g ++ eine illegale Anweisung wie diese erzeugen? Es ist nicht so, als kompiliere ich für Windows, dann laufe ich unter Linux (was auch dann, solange beide auf x86 sind, sollte AFAIK keine Illegal Instruction verursachen). Ich werde die Hauptdatei unten posten.
Ich kann den Fehler nicht zuverlässig reproduzieren. Obwohl, wenn ich zufällige Änderungen mache (fügen Sie hier ein Leerzeichen ein, ändern Sie eine Konstante dort), die eine Neukompilierung erzwingen, kann ich eine Binärdatei erhalten, die mit Illegal Instruction jedes Mal, wenn es ausgeführt wird, fehlschlägt, bis ich versuche, einen Haltepunkt zu setzen illegaler Unterricht 'verschwinden'. :(
#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();}
}
Ich würde empfehlen, die fehlerhaften Speichermodule zu ersetzen. – avakar
Ich würde vorschlagen, den fehlerhaften Kommentar Autor zu ersetzen. –
Führen Sie Ihren Code unter Gdb und dann, wenn Sie die Ausnahme erhalten eine Backtrace (BT). –