2014-12-19 2 views
1

함수를 사용하여 레벨을 생성 중이므로 그를 업데이트하기 위해 포인터를 포인터로 보내고 있습니다. 그러나 SDL_MapRGB를 사용하려고하면 *screen->format 부분에 오류가 발생합니다. 이렇게하는 방법이 있습니까? 여기 내가 사용하고 코드입니다 :SDL_MapRGB, 포인터에 포인터를 사용하여 화면 -> 형식을 얻는 방법

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 (얼마나 절망적인가 ^^)으로 시도했습니다.

편집 : 오류

error: request for member 'format' in '* screen', which is of pointer type 'SDL_Surface*' (maybe you meant to use '->' ?)"`

+1

'(* 화면) -> 형식'은 어떻습니까? –

+0

완벽한!당신은 항상 Sourav를 돕기 위해 여기에 있습니다. "()"이 필요한 이유를 물어볼 수 있습니까? – DoT

+0

[연산자 우선 순위] (http://en.cppreference.com/w/c/language/operator_precedence)와 관련이 있습니다. 댓글로 게시 할 수있는 긴 비트. 내 대답을 자세히 설명하겠습니다. :-) –

답변

2
*

단항 참조 연산자는 구조체 포인터 액세스 연산자 ->operator precedence보다 낮은 갖는다. 즉, 실제로는 *(screen->format)입니다.

는 당신이 바로 그 우선 순위 얻기 위해 일부 괄호가 필요합니다 (*screen)->format

+0

하하, 고마워! 나는이 마지막 날에 포인터에 대해 많이 배우고있어! @Sourav Ghosh 너무 너 덕분에;) 좋은 하루 되세요. – DoT

3

TL을, DR 솔루션을 ->이 (*screen)->format에 코드를 변경합니다.

이유 : 포인터를 통해 구조와 연합 부재 액세스]

operator precedence 규칙으로 당

,

-> 조작자가 * [간접 (간접 참조)] 연산자 위에 높은 우선있다.

그래서, 코드 *screen->format효과적으로

*(screen->format) 

  1. screen 포인터 그건
  2. 에서 format 멤버 변수에 액세스하려고 [적] 의미

    처럼 행동입니다 참조를 취소하려 함 screen->format.

하지만, SDL_Surface** screen, 정의에 따라, screenSDL_Surface**하지 SDL_Surface*입니다. 그래서 오류가 발생합니다.

은 당신이 원하는 것은 SDL_Surface* 포인터가 [(*screen)]

  • 그런 다음, 그 포인터에서 format 멤버 변수에 액세스 얻을

    1. 역 참조 screen에 실제로있다. [(*screen)->format]
  • +0

    와우. 나는 당신이 같은 시간에 위에 준 링크를보고있다;) 이것은 약간 힘들다. 나는 이걸 내 손으로해야 해. 명확한 설명에 감사드립니다. – DoT

    +0

    @SoJJu 오신 것을 환영합니다. :-) –

    관련 문제