제 목 구조체 공부중에 이해가 안되는것이 있습니다.
작성자 박종욱 등록날짜 2021-08-22 08:36:50 / 조회수 : 89
강좌명 [패키지] 게임 프로그래밍 입문패키지
  • 20 ~ 21 강의 하이로우 카드게임을 만드는 강의를 진행중입니다.

     

     

    [ 질문 1]

    // 처음에 선언한 enum 문과

    enum E_SHAPE { E_SPADE, E_DIA, E_HEART, E_CLOVER, E_MAX };
    enum E_SELECT { E_QUIT, E_HIGH, E_LOW, E_SEVEN };

     

    // 그 밑에 선언한 구조체

    struct tagCard
    {
        char*        szShape;
        int            nNumber;
    };

     

    // 그리고 enum과 구조체가 사용될 때.

    void InitCards(tagCard* cards)
    {
        for (E_SHAPE i = E_SPADE; i < E_MAX; i = (E_SHAPE)(i + 1))
        {
            for (int j = 0; j < 13; j++)
            {
                switch (i)
                {
                case E_SPADE:
                    cards[i * 13 + j].szShape = (char*)"♠";
                    break;
                case E_DIA:
                    cards[i * 13 + j].szShape = (char*)"◆";
                    break;
                case E_HEART:
                    cards[i * 13 + j].szShape = (char*)"♥";
                    break;
                case E_CLOVER:
                    cards[i * 13 + j].szShape = (char*)"♣";
                }

                cards[i * 13 + j].nNumber = j + 1;
            }
        }
    }

     

    제가 헷갈리는것은...

    카드의 초기화 함수에서 enum으로 선언된 카드의 타입마다

    일일이 문양을 넣어주고, 숫자를 지정해줍니다.

     

    그리고 이것은 구조체의 szShape 과 nNumber 변수를 이용하여 지정합니다.

    이게 이해가 안됩니다.

    도대체 이 변수들은 각각의 enum 타입의 어디로 저장이 되는건가요?

    정확한 경로..? 정확한 과정을 알고싶습니다. 이해가 안되어서요..

     

    일단은 main() 함수에 선언된 배열.

    tagCard stCards[52];

    바로 이 배열의 각 인덱스마다 저장이 되는것이라는건 알겠습니다.

    그런데 stCards[0] 번째 배열의 카드에 구조체 szShape 과 nNumber 변수가

    한 번에 저장이 된다는거 아닌가요?

    그 말은 즉..

    stCards[0 ~ 51] 번의 인덱스 전부 각. 각. 에 tagCard 구조체가 저장된다는 말인가요?

    그러니까 즉.. tagCard 구조체가 총 52개가 생성..? 52번 사용..? 되는것인가요?

     

    stCards[0] 번째 배열의 nNumber 는 도대체 어디에 저장된 건가요.. ㅜ

    솔직히 말씀드리면 제가 뭘 모르는지도 모르겠습니다.

     

    저는 그냥.. 배열 52개가 있는데.. 구조체는 한 개 인데

    도대체 배열 52개의 각각의 nNumber와 szShape 변수가 어디에 저장된다는건지

    잘 모르겠습니다.

     

    [질문 2]

    어째서 tagCard 구조체에서 nNumber는 포인터가 아닌가요

     

    [질문 3]

    int Betting(int money) 에서 파라메터가 포인트 형식이 아닌데

    nBet = Betting(*money); 금액을 베팅할때는 포인터로 넘겼습니다.

    void Play(tagCard* cards, int* money, int* index, bool* playing) 함수의 파라메터가 애초에 money를

    포인터 형식으로 받기 때문인걸로 보이는데요.

     

    이게 Betting 의 파라메터가 어떤 타입으로 받는지는 상관없는건가요?

    물론 같은 int 타입이어야겠지만.

    포인터 타입은 변수의 주소를 가리키는 주소값이고

    Betting(*money) 는 money의 주소값을 넘긴것이 아닌가요.

    그럼 int Betting() 에서는 money의 주소값을 받아

    int nBet = 0;
        while (nBet < 100 || nBet > money) // 정상적인 배팅이 이루어질 때 까지 무한 반복
        {
            cout << "금액을 배팅하시오.(100 ~ 배팅 보유 금액까지) : ";
            cin >> nBet;
        }

    이렇게 Betting 금액이 0보다 작은지에 대해 체크하는데만 사용되는데 

    Play(stCards, &nMyMoney, &nCurrIndex, &isPlaying);

    애초에 Play 함수 호출할때 nMyMoney를 &를 이용해서 주소값을 받아오네요!

    1. Play() 호출시 &로 nMyMoney 의 주소값을 받아온다.

    2. 받아온 nMyMoney의 주소값을 Play 함수 내에서 *로 Betting에 넘겨준다.

    3. nMyMoney의 주소값을 넘겨받은 Betting에서 nMyMoney 메모리 주소에 있는 '값'이 0 보다 작은지 체크한다.

    이게 맞나요?

     

     

     

     

     

     

     

  • 작성자 : 게임클래스 / 등록날짜 : 2021-08-23 09:56:06
  • 안녕하세요 게임클래스 프로그래밍 강사 하민우 입니다.

     

    [답변1]

    구조체는 여러개의 데이터를 가지고 있는 그룹 입니다.

    struct tagCard
    {
        char*        szShape;
        int            nNumber;
    };

    위와 같은 구조체를 선언 했다면

    모양 정보(문자열)와 정수값을 가지고 있는 것으로 해당 구조체로 52개 크기의 배열을 선언하면 각 인덱스별로 모양정보와 정수 값을 갖고 있게 되는 겁니다.

     

    [답변2]

    포인터로 선언하고 하지 않고는 프로그래머의 설계에 따른 선택이지 꼭 포인터이여야 한다 아닌다가 정해져 있지 않습니다.

     

    [답변3]

    int* money;

    여기서 money 는 주소값을 가지고 있는 변수이며 *money 는 해당 주소 값이 가르키고 있는 정수 값 입니다.

    int Betting(int money) 함수에서는 매개변수로 정수 값을 요구하고 있기 때문에 함수 호출시 정수값을 넘겨야하고

    nBet = Betting(*money); 부분은 포인터 변수가 가르키고 있는 정수값을 넘기는 겁니다.

     

    포인터에 대해서 정확히 이해가 되지 않는 경우 15강부터 다시 한번 복습하시고 해당 강의만으로 포인터에 대한 이해가 충분하지 않은 경우 구글, 네이버 등에 C++ 포인터 라고 검색하시면 쉽게 많은 자료를 찾아 보실 수 있습니다.

     

    항상 열공하시고 또 궁금한게 있으시면 언제든지 질문 주시기 바랍니다.

    게임 개발자가 되는 가장 빠른 길, 게임클래스!