В последнее время я пытался научить себя SDL на C ++ из учебников LazyFoo (lazyfoo.net). Изучив его первые десять уроков или немного поиграв с ними, я решил попробовать создать движок набора плиток, пытаясь изменить его учебник 39 использовать только набор плиток (оригинальный учебник также включает в себя движущуюся точку, обнаружение столкновений и область просмотра).
Тем не менее, я быстро закончил с Xcode, давая мне ошибку в потоке 1, определенную как EXC_BAD_ACCESS (код = EXC_I386_GPFLT). Думая, что это была просто неаккуратная ошибка кодирования, я попытался собрать и запустить файлы LazyFoo был связан с, но они дали похожие ошибки.
Куском кода, который дал проблему, была функция LTexture :: loadFromFile, которая принимала один аргумент std :: string path. Функция предназначена для загрузки поверхности из файла, а затем возвращает ее в качестве текстуры. Исходный код гласит:
bool LTexture::loadFromFile( std::string path )
{
//Get rid of preexisting texture
free();
//The final texture
SDL_Texture* newTexture = NULL;
//Load image at specified path
SDL_Surface* loadedSurface = IMG_Load( path.c_str() );
if( loadedSurface == NULL )
{
printf( "Unable to load image %s! SDL_image Error: %s\n", path.c_str(), IMG_GetError() );
}
else
{
//Color key image
SDL_SetColorKey( loadedSurface, SDL_TRUE, SDL_MapRGB( loadedSurface->format, 0, 0xFF, 0xFF ) );
//Create texture from surface pixels
newTexture = SDL_CreateTextureFromSurface( gRenderer, loadedSurface );
if( newTexture == NULL )
{
printf( "Unable to create texture from %s! SDL Error: %s\n", path.c_str(), SDL_GetError() );
}
else
{
//Get image dimensions
mWidth = loadedSurface->w;
mHeight = loadedSurface->h;
}
//Get rid of old loaded surface
SDL_FreeSurface( loadedSurface );
}
//Return success
mTexture = newTexture;
return mTexture != NULL;
}
Строка, которая дает ошибку
SDL_SetColorKey( loadedSurface, SDL_TRUE, SDL_MapRGB( loadedSurface->format, 0, 0xFF, 0xFF ) );
Еще раз, ошибка читает
Поток 1: EXC_BAD_ACCESS (код = EXC_I386_GPFLT).
Если эта строка будет удалена, это приведет к другой ошибке в следующей строке
newTexture = SDL_CreateTextureFromSurface( gRenderer, loadedSurface );
С другим кодом:
Поток 1: EXC_BAD_ACCESS (код = 2, адрес = 0x100000071)
Я искал решение и получил много обращений к GPFLT (что должно означать отказ общей защиты), но ни одно из решений не кажется применимым к моей проблеме. Кто-нибудь видит проблему в моем коде, или кто-то сталкивался с подобными проблемами в прошлом, чтобы эту ошибку можно было решить?
Заранее спасибо,
Matthijs
Еще раз, я использую SDL2 и SDL2-Image, загруженные вместе с Homebrew как Dylibs. В прошлом они всегда работали. Я программирую на C ++ на последнем iMac с большим количеством оперативной памяти, процессором i7 и самой последней версией OSX. Моя IDE это Xcode 6.1.1
Задача ещё не решена.