库调用上的分段错误

时间:2012-03-06 05:14:47

标签: c++ segmentation-fault chipmunk

我正在使用一个名为Chipmunk的物理库来制作我正在编写的游戏。

在我的initialize函数中,我初始化全局变量cpSpace space。然后在更新中,我致电cpSpaceStep(space, timestep)。该函数的原型是void cpSpaceStep(cpSpace *space, cpFloat dt);。我在这个函数调用上遇到了段错误。我在下面的代码中标记了这两个函数调用。

完整代码如下:

#include "../include/SDL/SDL_image.h"
#include "../include/SDL/SDL.h"
#include "../include/Player.h"
#include "../include/Timer.h"
#include "../include/Block.h"
#include "../include/ImageLoader.h"
#include "../include/chipmunk/chipmunk.h"
#include <string>

//Screen attributes
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;

//The frame rate
const int FRAMES_PER_SECOND = 60;

SDL_Event event;
SDL_Surface *screen = NULL;
SDL_Surface *player_img = NULL, *block_img = NULL;
Player *player;
Timer fps;
cpSpace *space;

bool quit = false;

void initialize();
void update();

int main( int argc, char* argv[] )
{
    initialize();
    update();

    return 1;
}

void initialize()
{
    //Initialize all SDL subsystems
    if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
    {

    }

    //Set up the screen
    screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );

    //If there was an error in setting up the screen
    if( screen == NULL )
    {

    }

    //Set the window caption
    SDL_WM_SetCaption( "Move the Dot", NULL );

    cpVect gravity = cpv(0, 100);

//******************cpSpacenew()*****************       
//This is where space is init'ed
    space = cpSpaceNew();
//***********************************************


}

void update()
{
    //While the user hasn't quit
    while( quit == false )
    {
        //Start the frame timer
        fps.start();

        while( SDL_PollEvent( &event ) )
        {
            //Handle events for the dot
            player->handle_input( &event );

            //If the user has Xed out the window
            if( event.type == SDL_QUIT )
            {
                //Quit the program
                quit = true;
            }
        }

        player->update();

        cpFloat timeStep = 1.0/FRAMES_PER_SECOND; 

  //************************Segfault**********************************************
        cpSpaceStep(space, timeStep);
  //******************************************************************************

        //Cap the frame rate
        if( fps.get_ticks() < 1000 / FRAMES_PER_SECOND )
        {
            SDL_Delay( ( 1000 / FRAMES_PER_SECOND ) - fps.get_ticks() );
        }
    }
}

2 个答案:

答案 0 :(得分:1)

你的cpInitChipmunk()电话在哪里?没有它,cpSpaceNew()很可能会返回NULL(或垃圾)。

很容易检查。在致电cpSpaceNew()后,立即插入:

printf ("%p\n", space);

(或类似的东西,看看它是什么。

在尝试使用它之前,你可能也想做那个immediatley,以防万一它会破坏它。

答案 1 :(得分:0)

可能因为space在调用cpSpaceStep()时为NULL。在cpSpaceStep()函数中,尝试取消引用NULL指针。检查space中是否已正确初始化initialize()