SDL_MapRGB, как получить экранный формат, используя указатель на указатель

Я генерирую уровень, используя функцию, и поэтому посылаю указатель на указатель моего экрана, чтобы обновить его.
Но когда я пытаюсь использовать 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 и даже &экран-> формат (как я в отчаянии ^^).

Редактировать: ошибка

ошибка: запрос для элемента ‘format’ в ‘* screen’, который имеет тип указателя ‘SDL_Surface *’ (возможно, вы намеревались использовать ‘->’?) «`

1

Решение

Одинарный * оператор разыменования имеет более низкий приоритет оператора чем оператор доступа к указателю структуры ->, Это означает, что вы на самом деле делаете *(screen->format),

Вам нужно несколько скобок, чтобы получить правильный приоритет: (*screen)->format

2

Другие решения

TL; DR решение —> Измените свой код на (*screen)->format,

Причина:

В соответствии с приоритет оператора правило,

-> Оператор [Структура и доступ к члену объединения через указатель] имеет более высокий приоритет над * Оператор [косвенность (разыменование)].

Итак, ваш код *screen->format, является фактически вести себя как

 *(screen->format)

что значит,

  1. он пытается получить доступ к format переменная-член из screen указатель
  2. Это [в идеале] пытается разыменовать screen->format,

Но, согласно определению, SDL_Surface** screen, screen является SDL_Surface**не SDL_Surface*, Вот почему вы получаете ошибку.

То, что вы хотите, это на самом деле

  1. разыменовывают screen чтобы получить SDL_Surface* указатель [(*screen)]
  2. Затем получите доступ к format переменная-член из этого указателя. [(*screen)->format]
3

По вопросам рекламы [email protected]