Program received signal SIGSEGV, Segmentation

qosmio Messages postés 14 Statut Membre -  
qosmio Messages postés 14 Statut Membre -
Bonsoir,

J'ai écris en C et en OpenGl un code source permettant de générer un paysage. Le programme se compile, mais lors de l'exécution, il m'affiche que pasyage.exe a rencontré un problème et doit fermer, et dans la console, il m'affiche cec: Process returned -1073741819 <0xC0000005> execution time : 8.125 s

Quand je lance le debugger par le menu Debug->Start, voici ce qui m'affiche:

Building to ensure sources are up-to-date
Build succeeded
Selecting target:
Debug
Adding source dir: I:\Informatique\Technique de rendu\paysage\
Adding source dir: I:\Informatique\Technique de rendu\paysage\
Adding file: bin\Debug\paysage.exe
Starting debugger:
done
Registered new type: wxString
Registered new type: STL String
Registered new type: STL Vector
Setting breakpoints
Debugger name and version: GNU gdb 6.7.50.20071127
Child process PID: 632
Program received signal SIGSEGV, Segmentation fault.
At I:/Informatique/Technique de rendu/paysage/terrain.c:233

En plus, une autre fenetre qui s'appelle Call Stack où il y a le nom des fonctions indiquant la présence des erreurs grace aux numéros de lignes.

-dessine_sol(x=-1, y=-2)
-choisir_texture()
-display()
-glutMainLoop()
-glutMainLoop()
-main(argc=1, argv=0x3e2638)

choisir_texture() et displaya() appellent dessine_sol.
glutMainLoop est appelée dans main.

Quand je lance par le menu Debuf->Debugging windows->Watches, une fenetre qui affiche ceci :

Local variables
m
name=0x47fa0000 <Adress 0x47fa0000 out of bounds>
name_texture=0x0
heightmap=0x0
texchrg=0x0

i=0
j=0
posi=-5121
posj=-10240

Function Arguments
x=-1
y=-2

Je n'ai pas affiché le code source car il est assez long, cependant si vous voulez que je l'affiche pour mieux éclaircir et m'aider à trouver les erreurs, je l'afficherai dans le prochain message.

Merci d'avance de votre aide et pour ceux qui s'intéressent à résoudre mon problème.

1 réponse

qosmio Messages postés 14 Statut Membre
 
J'ai dépose 3 fichiers: Loader.c, Loader.h et Terrain.c

C'est le fichier Loader.c

*Charger une texture*/
GLuint Charger_Texture(char *filename, GLuint * texchrg,int n){
Image *image;
image = (Image *) malloc(sizeof(Image));
ImageLoad(filename, image);
texchrg=(GLuint*)malloc (sizeof(GLuint));
glEnable(GL_TEXTURE_2D);
glGenTextures(1, texchrg);
glBindTexture(GL_TEXTURE_2D, *texchrg);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, image->sizeX, image->sizeY, GL_RGB, GL_UNSIGNED_BYTE, image->data);
free(image->data);
free(image);
return *texchrg;
}

/*Chargement des textures de base des heightmaps*/
void init_texture(){
neige = (Image *) malloc(sizeof(Image));
roche = (Image *) malloc(sizeof(Image));
prairie = (Image *) malloc(sizeof(Image));
eau = (Image *) malloc(sizeof(Image));

ImageLoad("I:/Informatique/Technique de rendu/paysage/Images/neige.bmp", neige);
ImageLoad("I:/Informatique/Technique de rendu/paysage/Images/roche.bmp", roche);
ImageLoad("I:/Informatique/Technique de rendu/paysage/Images/grass.bmp", prairie);
ImageLoad("I:/Informatique/Technique de rendu/paysage/Images/eau.bmp", eau);
}

/*Calcul des couleurs pour chaque pixel des heightmaps selon la hauteur*/
participation Terrain_RemplitPart(float haut){
participation part;
//p:prairie, r:roche, n:neige, e:eau,
int add;
if(haut<5.0){//les faible altitudes correspondent a la texture eau
part.p=0.0;
part.r=0.0;
part.n=0.0;
part.e=1.0;

}
else{
add = haut + (rand()%25)-15; //un petit peu de hasard
if(add<0) add = 0;
if(add>255) add = 255;
haut = add;
if(haut<20.0){// melange d'eau et de prairie
part.p = (haut-5.0)/10.0;
part.r = 0.0;
part.n = 0.0;
part.e = 1.0 - (haut-5.0)/10.0;

}
else if(haut<60.0){// en moyenne altitude on a de la pairie
part.p = 1.0;
part.r = 0.0;
part.n = 0.0;
part.e = 0.0;

}
else if(haut<130.0){// melange de prairie et de roche
part.p = 1.0 - (haut-60.0)/70.0;
part.r = (haut-60.0)/70.0;/*Charger une texture*/
part.n = 0.0;
part.e = 0.0;

}
else if(haut<180.0){// en haute altitude on a de la roche
part.p = 0.0;
part.r = 1.0;
part.n = 0.0;
part.e = 0.0;

}
else if(haut<220.0){// melange de roche et de neige
part.p = 0.0;
part.r = 1.0 - (haut-180.0)/40.0;
part.n = (haut-180.0)/40.0;
part.e = 0.0;

}

else{// et en tres haute altitude on a de la neige
part.p = 0.0;
part.r = 0.0;
part.n = 1.0;
part.e = 0.0;

}
}
return part;
}

/*Charger une heightmap, remplit la matrice d'altitude, puis cree la matrice de couleurs et genere la texture correspondante */
multitexture creer_texture(multitexture m){

int i,j;
int k,l;
Image *image = (Image *) malloc(sizeof(Image));
ImageLoad(m.name, image);
//remplisage de la matrice d'altitude 'mt.heightmap[][]':
m.heightmap=(float**)malloc(SIZE*sizeof(float*));
for (i=SIZE-1,k=0;i>0;i--,k++){
m.heightmap[k]=(float*)malloc (SIZE*sizeof(float));
for(j=0,l=0;j<SIZE*3;j+=3,l++){
m.heightmap[k][l]=image->data[i*image->sizeX*3+j];
pourcentage[k][l]=Terrain_RemplitPart(m.heightmap[k][l]);//calcul de la matrice de couleur
}
}
generer_texture(m);//generation de la nouvelle texture
free(image);
return m;
}

Le fichier Loader.h

#define SIZE 512 //taille des images de multitexture
#define N 50 //taille de la heihtmap: 50*50*SIZE

//FONCTIONS PERMETTANT:
//-le chargemet des images et textures bmp
//-la sauvegarde d'images bmp
//-le chargement de heightmaps bmp
//-la creation de nouvelles textures en fonction des heightmaps

//Structure stockant les données d'une image bmp
typedef struct {
unsigned long sizeX;
unsigned long sizeY;
GLubyte *data;
} Image;

//Structure correspondant aux participations des textures de base pour un pixel d'une heightmap
struct participation {
float p;//pourcentage de la texture 'prairie'
float r;//pourcentage de la texture 'roche'
float n;//pourcentage de la texture 'neige'
float e;//pourcentage de la texture 'eau'

};
typedef struct participation participation;

/*Structure permettant de stocker les informations necessaires a l'exploitaton d'une heightmap*/
typedef struct multitexture{
char *name; //son nom pour le chargement de la heightmap
char *name_texture; //nom de la texture generee
float **heightmap; //la matrice contenant les altitudes correspondant aux niveaux de gris
GLuint *texchrg; //la texture "name_texture" chargee
} multitexture;

/*LES FONCTIONS*/
//Les images et textures bmp
static unsigned int getint(FILE *);
static unsigned int getshort(FILE *);
int ImageLoad(char *, Image *);
int ImageSave(char *filename, Image *image);
GLuint Charger_Texture(char *, GLuint * ,int );

//Exploitation des multitextures pour les heightmaps
void init_texture();
multitexture creer_texture(multitexture);
void generer_texture(multitexture);

/*LES VARAIBLES*/
int HEIGHTMAP[N][N]; //La heightmap
static GLuint *CIEL; //structure ciel

Image *neige,*roche,*prairie, *eau;//textures de base pour les heightmaps
multitexture mt[5];//tableau de multitexture pour les heightmaps
int nbtexture;//nombre de textures pour les heightmaps
participation pourcentage[SIZE][SIZE];
float rouge[SIZE][SIZE];//tableau contenant les valeurs de la couleur rouge pour chaque pixel de la texture generee
float vert[SIZE][SIZE];//tableau contenant les valeurs de la couleur vert pour chaque pixel de la texture generee
float bleu[SIZE][SIZE];//tableau contenant les valeurs de la couleur bleu pour chaque pixel de la texture generee

Le fichier Terrain.c

//dessine une multitexture correctement, en respectant les altitudes
void dessine_sol(int x, int y){
multitexture m;
int i,j;
float posi,posj;

//on calcule la multitexture correpondante a HEIGHTMAP[x][y]
m=mt[HEIGHTMAP[x][y]];

glBindTexture(GL_TEXTURE_2D, m.texchrg);//on utilise la texture qui lui est associee
glPushMatrix();
glEnable(GL_TEXTURE_2D);

//pour chaque pixel (i,j) de la multitexture:
for(i=0 ,posi=taille*x;i<SIZE-2;i++,posi+=pas){
for(j=0, posj=taille*y;j<SIZE-1;j++,posj+=pas){

//on dessine les deux triangles formés par le carre: (i,j),(i,j+1),(i+1,j),(i+1,j+1)
glBegin(GL_TRIANGLE_STRIP);
glTexCoord2f( ((float) j)/SIZE, ((float) i)/SIZE);

//l'erreur se situe sur cette ligne (glVertex3f)
glVertex3f(posi,m.heightmap[i][j]*alt,posj);

glTexCoord2f( ((float) j+1)/SIZE, ((float) i)/SIZE);
glVertex3f(posi,m.heightmap[i][j+1]*alt,posj+pas);
glTexCoord2f( ((float) j+1)/SIZE, ((float) i+1)/SIZE);
glVertex3f(posi+pas,m.heightmap[i+1][j+1]*alt,posj+pas);

glTexCoord2f( ((float) j)/SIZE, ((float) i)/SIZE);
glVertex3f(posi,m.heightmap[i][j]*alt,posj);
glTexCoord2f( ((float) j+1)/SIZE, ((float) i+1)/SIZE);
glVertex3f(posi+pas,m.heightmap[i+1][j+1]*alt,posj+pas);
glTexCoord2f( ((float) j)/SIZE, ((float) i+1)/SIZE);
glVertex3f(posi+pas,m.heightmap[i+1][j]*alt,posj);
glEnd();
}
}
glDisable(GL_TEXTURE_2D);
glPopMatrix();
}

//Trouve une multitexture dans les environs, la selectionne pour la dessiner
void choisir_texture(){
int i,j,x,y;
x=(int)(xcam/taille);
y=(int)(ycam/taille);
for(i=x-5;i<=x+5;i++)
for(j=y-5;j<=y+5;j++)
if (HEIGHTMAP[i][j] != 0){
x=i;
y=j;

//La deuxième erreur se trouve sur dessine_sol
dessine_sol(x,y);
return;
}
dessine_sol(x,y);
return;
}

/*fonction d'affichage*/
//dessine tous les elements du programme, repositionne la camera
void display(){
int i,j;
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

/* Rotation du sol autour d'un axe vertical*/
glRotatef(angleZ,0.0,0.0,1.0);
/* Position de la camera */
gluLookAt(xcam, ycam, zcam, xtarget, ytarget, ztarget, 0.0, 0.0, 1.0);

//dessin des sols plats
for (i=-50;i<N+50;i++)
for (j=-50;j<N+50;j++)
if(i<0 || j<0 || i>= N || j>=N)
dessineSolPlat(i,j,mt[HEIGHTMAP[0][0]]);
else
dessineSolPlat(i,j,mt[HEIGHTMAP[i][j]]);
//La troisème erreur se situe sur choisir_texture
choisir_texture();//selection d'une multitexture et dessine celle-ci en fonction de ses altitudes
glTranslatef(xtarget,ytarget,ztarget);
glPushMatrix();
dessineCiel();

glPopMatrix();
glPopMatrix();
glFlush();
FPS();
glutSwapBuffers();
}

//Fonction Main
//l'erreur est sur le main
int main(int argc, char *argv[]){

/*creation de la fenetre*/
glutInit(&argc, argv);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow("PAYSAGE NATUREL");

/*Fonctions d'initialisation*/
init_texture();
initialiser();

/*Fonctions de rappel*/
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutDisplayFunc(display);
glutMotionFunc(mouseMotion);
glutKeyboardFunc(keyboard_1);
glutSpecialFunc(keyboard_2);
glutReshapeFunc(reshape);

/*lancement de la boucle d'attente*/
// L'erreur est sur glutMainLoop
glutMainLoop();
return 0;
}
0