Ошибка сегментации при вызове библиотеки - PullRequest
0 голосов
/ 06 марта 2012

Я использую физическую библиотеку под названием Бурундук для игры, которую я пишу.

В моей функции 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 ]

1 голос
/ 06 марта 2012

Где твой cpInitChipmunk() звонок?Без этого вполне вероятно, что cpSpaceNew() вполне может вернуть NULL (или мусор).

Достаточно легко проверить.Сразу после вызова cpSpaceNew() вставьте:

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

(или что-то эквивалентное, чтобы увидеть, каково значение.

Вы также можете сделать это немедленно, прежде чем пытатьсяиспользуйте его на всякий случай, если что-то его испортит.

0 голосов
/ 06 марта 2012

Может быть потому, что space равен NULL, когда вы звоните cpSpaceStep().А в функции cpSpaceStep() делается попытка разыменования указателя, который NULL.Проверьте правильность инициализации space в initialize().

...