SDL_MapRGB,如何使用指针指针获取screen->格式

时间:2014-12-19 11:39:40

标签: c++ c pointers sdl sdl-1.2

我正在使用函数生成一个级别,所以我发送一个指向我的屏幕指针的指针来更新他。 但是当我尝试使用SDL_MapRGB时,我在*screen->format部分收到错误。 有没有办法做到这一点 ? 这是我正在使用的代码:

void generateLevel(SDL_Surface** screen)
{
    int i=0, j=0;
    char object =' ';
    FILE* level = NULL;
    SDL_Surface* lvl[LARGEUR_MAP][HAUTEUR_MAP];
    SDL_Rect posElem;

    //Ouverture du fichier contenant les infos du niveau
    level = fopen("lvl.txt","r");

    if(level == NULL)
    {
        fprintf(stderr,"Erreur lors de l'ouverture du fichier");
        exit(EXIT_FAILURE);
    }

    //Boucle pour lire le fichier et placer les éléments du décor
    for(j=0;j<HAUTEUR_MAP;j++)
    {
        for(i=0;i<LARGEUR_MAP;i++)
        {
            object = fgetc(level);
            if(object == '\n')
                object = fgetc(level);
            switch(object)
            {
                case 'm':
                    lvl[i][j] = IMG_Load("images\\mur.jpg");
                    posElem.x = i*TAILLE_BLOC;
                    posElem.y = j*TAILLE_BLOC;
                    SDL_BlitSurface(lvl[i][j], NULL, *screen, &posElem);
                    break;
            }


        }
    }

    SDL_FillRect(*screen, NULL, SDL_MapRGB(*screen->format,255,255,255));
    SDL_Flip(*screen);
    fclose(level);
}

错误出现在代码的末尾,在SDL_FillRect()上; 一切都很好但是这个,我无法弄清楚如何做到这一点。尝试使用* screen-&gt;格式,** screen-&gt;格式,screen-&gt;格式,甚至&amp; screen-&gt;格式(我是多么绝望^^)。

编辑:错误

  

错误:请求'* screen'中的成员'format',它是指针类型'SDL_Surface *'(也许你打算使用' - &gt;'?)“`

2 个答案:

答案 0 :(得分:3)

TL; DR解决方案 - &gt;将您的代码更改为(*screen)->format

原因:

根据operator precedence规则,

->运算符[通过指针进行结构和联合成员访问]在* [间接(取消引用)]运算符上具有更高优先级

因此,您的代码*screen->format 有效的行为类似于

 *(screen->format)

这意味着,

  1. 它正在尝试从format指针
  2. 访问screen成员变量
  3. 理想情况下,尝试取消引用screen->format
  4. 但是,根据定义,SDL_Surface** screenscreenSDL_Surface**,而不是SDL_Surface*。这就是你收到错误的原因。

    你想要的实际上是

    1. 取消引用screen以获取SDL_Surface*指针[(*screen)]
    2. 然后,从该指针访问format成员变量。 [(*screen)->format]

答案 1 :(得分:2)

一元*解除引用运算符的结构指针访问运算符->operator precedence。这意味着你实际上在做*(screen->format)

您需要一些括号来获得正确的优先权:(*screen)->format