这让我疯狂,我觉得我几乎尝试过所有事情。
SDL_Surface * Cell::image=NULL;
//somewhere in main
Cell::LoadSurface(Cell::image, "image.bmp");
void Cell::LoadSurface(SDL_Surface * surf, char * filename)
{
if(surf == NULL)
{
SDL_Surface *temp;
SDL_Surface **temp2 = &surf;
temp = SDL_LoadBMP(filename);
if(temp == NULL)
printf("Cannot Load Image\n");
else
printf("Image Loaded\n");
surf = SDL_DisplayFormat(temp);
//*surf = *SDL_DisplayFormat(temp); //segfault
Uint32 colorkey = SDL_MapRGB(surf->format, 0, 0, 0 );
SDL_SetColorKey(surf, SDL_SRCCOLORKEY | SDL_RLEACCEL , colorkey);
SDL_FreeSurface(temp);
}
Image和LoadSurface都是静态的。无论分配给它的是什么,图像始终保持为null,否则程序将以段落错误终止,就像在注释行中一样。
谢谢,
答案 0 :(得分:3)
通过引用传递surf
以允许surf
中的更改反映回输入Cell::image
。
void Cell::LoadSurface(SDL_Surface*& surf, char* filename) {
// ^
...
答案 1 :(得分:2)
当您调用LoadSurface时,您正在创建(图像)指针的副本。 您可以使用指针引用:
void Cell::LoadSurface(SDL_Surface *& surf, char * filename)
或使用指向指针的指针:
void Cell::LoadSurface(SDL_Surface ** surf, char * filename)
请注意,在稍后您需要将呼叫更改为:
Cell::LoadSurface(&Cell::image, "image.bmp");
并更改LoadSurface以将surf视为指向指针的指针。
答案 2 :(得分:0)
传递给函数调用时会复制指针地址。这意味着当您在函数
中调用时surf = SDL_DisplayFormat(temp);
实际上你只是覆盖了Cell :: image地址的副本。
要修复此问题,您必须传入Cell :: image指针的地址,以便知道要使用新指针值更新哪个内存地址。
答案 3 :(得分:0)
感谢您的所有回复,我非常感谢您的帮助。
但事实证明,无法创建SDL_Surface结构的指针引用。由于SDL_Surface包含其他其他指针。我相应地重构了我的代码(改为返回SDL_Surface)。这使得这更像是与SDL相关的问题,而不是与c ++相关的问题。