2013-10-28 33 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 –