1

私は小さなプログラミングプロジェクトに取り組んでいたところ、宣言されていないものについてかなり一般的なエラーが発生しました。

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;
      }
    }

  }

}
4

1 に答える 1

2

通常、「タイプ」または「タイプの変数」の決定に直面した場合、コンパイルは常に「タイプの変数」を想定します。これが、Userオブジェクトとしてのアクセスが機能する理由です。

ただし、同時に、型を使用して新しいオブジェクトを宣言することはUserできません。これは、コンパイラにとって、これは型ではなく変数であるためです。

つまり、変数の名前Userをタイプ名以外の名前(つまりUserObject、何か)に変更すると、コードはその点で問題なく機能するはずです。

明確にするために、これは私の提案された修正です:

void RemoveUserFromGameRoom(User *myUser) {

    if (myUser->GameRoom != NULL) {
        GameRoom *GameRoom = myUser->GameRoom;
        //More code to come
    }
    //Some more code
 }
于 2013-02-23T08:03:03.023 に答える