исключение плохого доступа — ошибка exc_bad_access xcode5 c ++ sdl2

Я играл с этим кодом, парень на youtube, прикрепленный к одному из его обучающих видео … Я столкнулся с несколькими проблемами, которые, похоже, не могу решить … На данный момент это ошибка ‘EXC_BAD_ACCESS’. .. Из того, что я кратко исследовал в Интернете, эти ошибки возникают, когда вы неправильно используете стек и выделяете память для вещей, которые больше не существуют или что-то в этом роде … Я просто не могу точно определить, что я делаю неправильно … Я видел, что устранены некоторые неисправности — но пока ничего для xcode 5

Ошибка отображается в классе с именем «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;’

получает ошибку, которую я положил рядом с ней … но не знаю, что еще может быть причиной этого … я надеялся, что кто-то может объяснить, почему ошибки 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. Тем не менее, я думаю, что rect является SDL_Rect*,

Функция получения ошибки cSprite::cSprite()т.е. конструктор Одна из его обязанностей — инициализировать всех участников класса разумными значениями.

Тем не менее, я не вижу ни одного кода, который инициализирует rect указывать на что-либо. Ошибка, которую вы сейчас получаете, предполагает, что вы разыменовываете указатель задницы, и это согласуется с этим наблюдением.

Вам либо нужно выделить SDL_Rect назначить rect, или вы должны изменить rect просто быть SDL_Rectне SDL_Rect*, Если вы сделаете последнее изменение, то вам также нужно будет изменить все свои rect-> в rect.и передать указатель на rect в вызовах SDL, которые этого требуют (т.е. SDL_RenderCopy(renderer, image, NULL, &rect);)

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector