1

我正在使用一个函数生成一个关卡,所以我正在发送一个指向我的屏幕指针的指针来更新他。但是当我尝试使用 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->format、**screen->format、screen->format 甚至 &screen->format(我多么绝望 ^^)。

编辑:错误

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

4

2 回答 2

3

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

原因:

根据运算符优先级规则,

->运算符 [Structure and union member access through pointer]比[Indirection (dereference)] 运算符具有更高的优先级。*

因此,您的代码*screen->format实际上表现得像

 *(screen->format)

意思是,

  1. 它试图从指针访问format成员变量screen
  2. [理想情况下] 试图取消引用screen->format.

但是,根据定义,SDL_Surface** screenscreenSDL_Surface**,不是SDL_Surface*。这就是您收到错误的原因。

你想要的实际上是

  1. 取消引用screen以获取SDL_Surface*指针 [ (*screen)]
  2. 然后,format从该指针访问成员变量。[ (*screen)->format]
于 2014-12-19T11:54:52.433 回答
2

一元*解引用运算符的运算符优先级低于结构指针访问运算符->。这意味着你实际上在做*(screen->format).

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

于 2014-12-19T11:44:13.803 回答