Переназначение ссылки на указатели в C ++ - PullRequest
0 голосов
/ 16 марта 2011

Это сводит меня с ума, и я чувствую, что перепробовал почти все.

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 являются статическими.Изображение всегда остается нулевым, независимо от того, что ему назначено, иначе программа завершится с ошибкой, как в закомментированной строке.

Ответы [ 4 ]

3 голосов
/ 16 марта 2011

Передайте surf по ссылке, чтобы разрешить изменения surf, отраженные обратно на вход Cell::image.

void Cell::LoadSurface(SDL_Surface*& surf, char* filename) {
//                                 ^
   ...
2 голосов
/ 16 марта 2011

Когда вы вызываете LoadSurface, вы создаете копию указателя (изображения).Вы можете использовать ссылку на указатель:

void Cell::LoadSurface(SDL_Surface *& surf, char * filename)

Или использовать указатель на указатель:

void Cell::LoadSurface(SDL_Surface ** surf, char * filename)

Обратите внимание, что в дальнейшем вам потребуется изменить вызов на:

Cell::LoadSurface(&Cell::image, "image.bmp");

И измените LoadSurface, чтобы рассматривать серфинг как указатель на указатель.

0 голосов
/ 17 марта 2011

Спасибо за все ваши ответы, я очень благодарен за вашу помощь.

Но, как выясняется, указатель на структуру SDL_Surface не может быть сделан.Из-за того, что SDL_Surface содержит другие другие указатели.Я соответствующим образом реструктурировал свой код (вместо этого вернул SDL_Surface).Что делает это скорее проблемой, связанной с SDL, чем проблемой, связанной с c ++.

0 голосов
/ 16 марта 2011

Адреса указателей копируются при передаче в вызовы функций.Это означает, что когда вы вызываете функцию

surf = SDL_DisplayFormat(temp);

, вы на самом деле перезаписываете только копию Cell :: image address.

Чтобы исправить это, вы должны передать адрес Cell.:: указатель изображения, чтобы вы знали, какой адрес памяти обновлять новым значением указателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...