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

  1. 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