为什么在编译我的代码C(linux)时得到我的分段错误(核心转储)

时间:2014-02-18 17:46:44

标签: c linux sdl

这是我的代码。
任何人都可以帮助我吗?

#include <SDL/SDL.h>
#include <stdlib.h>
#include <stdio.h> 


int blit_image(char chemin[15],SDL_Surface *fenetre,int posx,int posy) {
    SDL_Surface *temp;
    SDL_Surface *image; 
    SDL_Rect position;

    temp = SDL_LoadBMP(chemin);

    image= SDL_DisplayFormat(temp);
    position.x = posx;
    position.y = posy; 
    position.w = image->w; 
    position.h = image->h;

    SDL_BlitSurface(image,NULL,fenetre,&position); SDL_Flip(fenetre);
    SDL_FreeSurface(temp); 
    SDL_FreeSurface(image); 
}

int main(int argc, char *argv[]) { 
    SDL_Surface *fenetre; 
    SDL_Event event; int done=1; SDL_Init(SDL_INIT_VIDEO);

    fenetre = SDL_SetVideoMode(910,600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    blit_image("resources/images/fondblanc.bmp",fenetre,0,0); 
    blit_image("resources/images/chat.bmp",fenetre,0,0);//cat 
    blit_image("resources/bouttons/chatbt.bmp",fenetre,820,25);//dog
    blit_image("resources/bouttons/chienbt.bmp",fenetre,820,140); //horse
    blit_image("resources/bouttons/chevalbt.bmp",fenetre,820,255); //tiger
    blit_image("resources/bouttons/tigrebt.bmp",fenetre,820,370);//hen
    blit_image("resources/bouttons/poulebt.bmp",fenetre,820,485);
    while (done) {

        SDL_WaitEvent(&event); 
        switch(event.type) {
        case SDL_QUIT: 
            {
                done=0;
                break; 
            }
        case SDL_MOUSEBUTTONDOWN:
            {
                if ((event.button.x>820)&&(event.button.x<890)&&(event.button.y<115)&&                                                     (event.button.y>25)) 
                { 
                    blit_image("resources/images/chat.bmp",fenetre,0,0); 
                }
                if ((event.button.x>820)&&(event.button.x<890)&&(event.button.y<230)&&         (event.button.y>140))
                { 
                    blit_image("resources/images/chien.bmp",fenetre,0,0); 
                } 
                if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<345)&&(event.motion.y>255))
                { 
                    blit_image("resources/images/cheval.bmp",fenetre,0,0);
                }
                if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<460)&&         (event.motion.y>370))
                {
                    blit_image("resources/images/tigre.bmp",fenetre,0,0); 
                }
                if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<575)&&(event.motion.y>485))
                {
                    blit_image("resources/images/poule.bmp",fenetre,0,0);
                } 
            }

        }

        if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<115)&&         (event.motion.y>25)) 
        {
            blit_image("resources/bouttons/chatbtClic.bmp",fenetre,820,25);
            blit_image("resources/bouttons/chienbt.bmp",fenetre,820,140); 
            blit_image("resources/bouttons/chevalbt.bmp",fenetre,820,255); 
            blit_image("resources/bouttons/tigrebt.bmp",fenetre,820,370);
            blit_image("resources/bouttons/poulebt.bmp",fenetre,820,485);
        }
        if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<230)&&(event.motion.y>140))
        {
            blit_image("resources/bouttons/chienbtClic.bmp",fenetre,820,140); 
            blit_image("resources/bouttons/chatbt.bmp",fenetre,820,25);
            blit_image("resources/bouttons/chevalbt.bmp",fenetre,820,255);
            blit_image("resources/bouttons/tigrebt.bmp",fenetre,820,370);
            blit_image("resources/bouttons/poulebt.bmp",fenetre,820,485);

        }
        if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<345)&&         (event.motion.y>255)) 
        {
            blit_image("resources/bouttons/chevalbtClic.bmp",fenetre,820,255);
            blit_image("resources/bouttons/chatbt.bmp",fenetre,820,25); 
            blit_image("resources/bouttons/chienbt.bmp",fenetre,820,140); 
            blit_image("resources/bouttons/tigrebt.bmp",fenetre,820,370); 
            blit_image("resources/bouttons/poulebt.bmp",fenetre,820,485);

        }

        if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<460)&&(event.motion.y>370)) { 
            blit_image("resources/bouttons/tigrebtClic.bmp",fenetre,820,370);

            blit_image("resources/bouttons/chatbt.bmp",fenetre,820,25);
            blit_image("resources/bouttons/chienbt.bmp",fenetre,820,140);
            blit_image("resources/bouttons/chevalbt.bmp",fenetre,820,255);

            blit_image("resources/bouttons/poulebt.bmp",fenetre,820,485);
        } 
        if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<575)&&(event.motion.y>485)) 
        {
            blit_image("resources/bouttons/poulebtClic.bmp",fenetre,820,485);

            blit_image("resources/bouttons/chatbt.bmp",fenetre,820,25);
            blit_image("resources/bouttons/chienbt.bmp",fenetre,820,140); 
            blit_image("resources/bouttons/chevalbt.bmp",fenetre,820,255);
            blit_image("resources/bouttons/tigrebt.bmp",fenetre,820,370);

        }
    } 

    SDL_Quit(); 

    return 0; 
}

我使用gcc game.c -o prog -lSDL -lSDL_mixer -lSDL_ttf

编译了它

代码编译成功但在输入./prog执行代码时会显示"Segmentation fault (core dumped)"

然而,使用的文件存在于目录

2 个答案:

答案 0 :(得分:3)

你宣布了这个职能:

int blit_image(char chemin[15],SDL_Surface *fenetre,int posx,int posy) {

因此参数#1有15个字符。

但是当你打电话给它时,你可以用:

来调用它
 blit_image("resources/images/fondblanc.bmp",fenetre,0,0); 

我的计数文件名是31个字符,不适合15个字符。

我还在代码中添加了一些printf语句,这些语句可以帮助您找出崩溃的位置。 您应该继续添加更多printf语句,直到缩小崩溃范围。

答案 1 :(得分:0)

代码中的 许多 问题之一是:

int blit_image(char chemin[15],SDL_Surface *fenetre,int posx,int posy)
{
    [...]
}

声明该函数返回int

您是否在该功能中看到return声明? 如果没有return语句,它如何返回int

您的main函数被声明为返回一个int,令人惊讶的是,以return 0;结束。
你是如何在main中完成的,而不是在你的其他功能中?