2013-10-28 34 views
1

我一直在用这段代码玩弄一个关于他的教程视频之一的YouTube上的家伙......我遇到了几个我似乎无法过去的问题...当前一个是'EXC_BAD_ACCESS'错误...从我在线简单研究过的内容来看,当你不正确地使用堆栈并将内存分配给不再存在的东西或类似的东西时,会发生这些错误......我只是无法确定我做错了准确...我已经看到了一些故障排除做 - 但没有为Xcode的5尚未exc_bad_access error xcode5 C++ sdl2

错误在一个名为“cSprite.cpp”类显示出来:

// ~~~~~~~~~~~~~~~~~~~  cSprite.cpp  ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

#include "stdafx.h" 
#include "cSprite.h" 
//#include "gMain.h" 
//#include <SDL2/SDL_main.h> 
//#include <SDL2/SDL.h> 
//#include "cSDL_Setup.h" 

using namespace std; 

void draw(SDL_Renderer, SDL_Texture, SDL_Rect); 

cSprite::cSprite(SDL_Renderer* passed_renderer, string filePath, int x, int y, int w, int h) 
{ 
    renderer = passed_renderer; 

    //... image 
    image = NULL; 
    image = IMG_LoadTexture(renderer,filePath.c_str()); 

    // image error message 
    if (image == NULL) 
    { 
     cout<<"Couldnt load image..."<<filePath.c_str()<<endl; 
    } 

    //image dimensions 
    rect->x = x;   // ***** Error: Thread 1:EXC_BAD_ACCESS(code=EXC_1386_GPFLT) 
    rect->y = y; 
    rect->w = w; 
    rect->h = h; 

}; 

cSprite::~cSprite(void) 
{ 
    SDL_DestroyTexture(image); 
} 

//get methods 
//SDL_Rect* cSprite::getRect() 
//{ 
// return rect; 
//} 

//get methods 
//SDL_Texture* cSprite::getImage() 
//{ 
// return image; 
//} 

void cSprite::draw() 
{ 
    SDL_RenderCopy(renderer, image, NULL, rect); 
} 

...行'rect-> x = x;'

得到我放在旁边的错误...但是idk还有什么可能导致它......我希望有人能解释为什么EXC_BAD_ACCESS错误甚至发生......和/或在我的代码的其余部分它可能是来自何处......

这里是我的另外3个.cpp文件

....

// ~~~~~~~~~~~~~~~~~~~~~~~~  gMain.cpp  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
#include <iostream> 
#include "stdafx.h" 
#include "gMain.h" 


using namespace std; 

gMain::gMain(int passed_screenWidth, int passed_screenHeight) 
{ 
    screenWidth = passed_screenWidth; 
    screenHeight = passed_screenHeight; 

    // quit boolean 
    quit = false; 

    // create instance of cSDL class 
    csdl_setup = new cSDL_Setup(&quit, screenWidth, screenHeight); 

    grass = new cSprite(csdl_setup->getRenderer(), "/Users/jamesbryant/Desktop/nuGame/nuGame/images.jpeg", screenWidth, screenHeight, screenWidth, screenHeight); 

    bruce_Lee = new cSprite(csdl_setup->getRenderer(), "/Users/jamesbryant/Desktop/nuGame/nuGame/lee.bmp", 300, 300, 200, 200); 


} 

gMain::~gMain(void) 
{ 
} 

void gMain::gameLoop(void) 
{ 
    // game loop logic 
    while (!&quit && csdl_setup->getMainEvent() ->type != SDL_QUIT) 
    { 
     csdl_setup->begin(); 

     grass->draw(); 
     bruce_Lee->draw(); 


     csdl_setup->end(); 

    } 
} 

....

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ cSDL_Setup.cpp ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
#include "stdafx.h" 
#include "cSDL_Setup.h" 
//#include "gMain.h" 

using namespace std; 

cSDL_Setup::cSDL_Setup(bool* quit, int screenWidth, int screenHeight) 
{ 
    // create window 
    window = NULL; 
    window = SDL_CreateWindow("rWDY_pWDR", 400, 400, screenWidth, screenHeight, SDL_WINDOW_RESIZABLE); 

    // if window couldnt be created... 
    if (window == NULL) 
    { 
     cout<<"Window couldnt be created..."<<endl; 

     *quit = true; 
     //exit(0); 
    } 

    //create renderer 
    renderer = NULL; 
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); 

    // initialize images 
    mainEvent = new SDL_Event(); 

} 

cSDL_Setup::~cSDL_Setup(void) 
{ 
    SDL_DestroyWindow(window); 
    SDL_DestroyRenderer(renderer); 
    delete mainEvent; 
} 

//get methods 
SDL_Renderer* cSDL_Setup::getRenderer() 
{ 
    return renderer; 
} 

SDL_Event* cSDL_Setup::getMainEvent() 
{ 
    return mainEvent; 
} 

void cSDL_Setup::begin() 
{ 
    SDL_PollEvent(mainEvent); 
    SDL_RenderClear(renderer); 
} 

void cSDL_Setup::end() 
{ 
    SDL_RenderPresent(renderer); 

} 

....

// ~~~~~~~~~~~~~~~~~~~~~~~~~~ firstGame.cpp ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
#include "stdafx.h" 
#include "cSDL_Setup.h" 
//#include "gMain.h" 

using namespace std; 

cSDL_Setup::cSDL_Setup(bool* quit, int screenWidth, int screenHeight) 
{ 
    // create window 
    window = NULL; 
    window = SDL_CreateWindow("rWDY_pWDR", 400, 400, screenWidth, screenHeight, SDL_WINDOW_RESIZABLE); 

    // if window couldnt be created... 
    if (window == NULL) 
    { 
     cout<<"Window couldnt be created..."<<endl; 

     *quit = true; 
     //exit(0); 
    } 

    //create renderer 
    renderer = NULL; 
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); 

    // initialize images 
    mainEvent = new SDL_Event(); 

} 

cSDL_Setup::~cSDL_Setup(void) 
{ 
    SDL_DestroyWindow(window); 
    SDL_DestroyRenderer(renderer); 
    delete mainEvent; 
} 

//get methods 
SDL_Renderer* cSDL_Setup::getRenderer() 
{ 
    return renderer; 
} 

SDL_Event* cSDL_Setup::getMainEvent() 
{ 
    return mainEvent; 
} 

void cSDL_Setup::begin() 
{ 
    SDL_PollEvent(mainEvent); 
    SDL_RenderClear(renderer); 
} 

void cSDL_Setup::end() 
{ 
    SDL_RenderPresent(renderer); 

} 

......这里就是我的cSprite.h文件看起来像现在:

#ifndef __game__cSprite__ 
#define __game__cSprite__ 
#pragma once 

#include <iostream> 
#include <SDL2/SDL_main.h> 
#include <SDL2/SDL.h> 

using namespace std; 


class cSprite 
{ 
public: 
    cSprite(SDL_Renderer* passed_renderer, string filePath, int x, int y, int w, int h); 
    ~cSprite(void); 

    void draw(); 

private: 
    SDL_Texture* image = NULL; 

    SDL_Rect* rect = NULL; 

    SDL_Renderer* renderer = NULL; 

}; 

#endif /* defined(__game__cSprite__) */ 

回答

1

你不发表您的cSprite头。不过,我想rectSDL_Rect*

获取错误的函数是cSprite::cSprite(),即。构造函数。其职责之一是将所有班级成员初始化为合理的价值。

但是,我没有看到任何代码初始化rect指向任何东西。您目前收到的错误表明您正在取消引用一个流氓指针,这与此观察一致。

您需要分配SDL_Rect以分配给rect,或者您应该将rect更改为SDL_Rect而不是SDL_Rect*。如果你使后者改变,那么你也将需要将所有更改为rect.,并在需要它(即SDL_RenderCopy(renderer, image, NULL, &rect);)的SDL调用一个指针传递给rect

+1

绝对导致我在正确的方向。 ..谢谢x1000 –