2013-02-23 2 views
1

선언되지 않은 변수 오류가 변수 결과를 선언하려고, 나는 뭔가에 대한 매우 일반적인 오류가 선언되지 않은되고있어 :C : 난 그냥 약간의 프로그래밍 프로젝트를 진행했다

MP_HighLevelData.c:230:15: error: ‘RemovedUser’ undeclared (first use in this function) 

사고가 난 그냥 잊고 있었던 변수를 선언하고, 내 소스 파일의 라인을 따라 갔고, 오류 코드 줄을 가리키는 것을 발견은 '아무튼 때문에

User *RemovedUser; 

홀수, 나는 새 변수를 선언 할 수 없습니다 존재하지 않습니까? 명확하게이 코드 라인이 잘못되었다고 확신하지는 않으므로보다 완전한 코드 스 니펫을 작성하십시오. 나는 내가 뭘 잘못했는지 알고 싶다. '형'나 '형의 변수'의 결정에 직면했을 때

void RemoveUserFromGameRoom(User *User) { 

    if (User->GameRoom != NULL) { 
    GameRoom *GameRoom = User->GameRoom; 

    if (GameRoom->Owner == User) { 

     // We should delete the whole game room, since the owner is leaving and a new owner isn't chosen automatically 
     while (GameRoom->UsersHead != NULL) { // Awesome way of looping while there are users left in the room 
     // We need to get rid of all the users in this game room, including the owner, before we can remove it 
     User *RemovedUser; 
     RemovedUser = GameRoom->UsersHead->User; 
     DeleteUserPtrFromGameRoom(GameRoom->UsersHead); // Remove reference to the user from the game room 
     RemovedUser->GameRoom = NULL; // Remove reference to the game room from the user (needs to be set afterwards, whoops) 
     } 

     // All the users have been kicked out, now we can take care of the game room 
     FreeRIDfromGameCategory(GameRoom->RID, User->GameCategory); 
     ClearGameRoomName(GameRoom); 
     DeleteGameRoomFromGameCategory(GameRoom, User->GameCategory); 

    } else { 
     UserPtr *UserPtr = GameRoom->UsersHead; 

     while (UserPtr != NULL) { 
     if (UserPtr->User == User) { 
      DeleteUserPtrFromGameRoom(UserPtr); 
      User->GameRoom = NULL; 
      break; 
     } 

     UserPtr = UserPtr->next; 
     } 
    } 

    } 

} 
+2

(사용자 * 사용자) - 당신은 컴파일러가 사용자 유형 및 사용자 매개 변수를 구별 할 수 있는지입니까? –

+0

@AlexFarber 흠. 그것을 놓쳤다. 오류는'사용자가 타입이 아님 '이어야합니다. – Arpit

답변

2

일반적으로, 컴파일은 항상 객체의 작품으로 User 액세스하는 이유, '유형의 변수를'가정합니다.

그러나 동시에 유형이 User 인 새 객체를 선언하는 것은 컴파일러의 경우 유형이 아니기 때문에 작동하지 않습니다.

간단히 말해서 변수 이름을 User으로 변경하면 형식 이름 (즉, UserObject 또는 그 이상)으로 바뀌므로 코드가 올바르게 작동해야합니다. 이 내 제안 된 수정 프로그램입니다 대한 명확한

:

void RemoveUserFromGameRoom(User *myUser) { 

    if (myUser->GameRoom != NULL) { 
     GameRoom *GameRoom = myUser->GameRoom; 
     //More code to come 
    } 
    //Some more code 
} 
+0

재미있는 점은 User * RemovedUser; 동일한 소스 파일의 다른 함수에서 오류를 생성하지 않습니다. 그리고 그것은이 기능 이전에 제공됩니다 ... – WillWill56

+0

@ WillWill56 예, 그게 문제가 아니기 때문에, 오히려 매개 변수는 'User * User'입니다. 그것이 당신이 이름을 바꿀 필요가있는 변수입니다. –

+0

하지만이 작품처럼 보이는데, 고마워. 네, 이것이 유일한 오류였습니다. 다른 모든 것은 잘 작동합니다. – WillWill56