제 목 20강 예외처리
작성자 컴공2018 등록날짜 2021-08-10 01:31:52 / 조회수 : 433
강좌명 [단과] 게임 프로그래밍 기초 C++ Part.2
첨부파일
  • 20강 중간 부분까지 수업을 듣고 실행하는데 사진 처럼 예외가 처리되지 않음이라고 오류가 뜹니다

    소스 코드를 잘못 작성한건가 싶어 확인해보았는데 코드에는 이상이 없는 것 같습니다 뭐가 문제일까요?

    아래는 실행 소스 코드입니다

     

     

    // ConsoleApplication15.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
    //

    #include "pch.h"

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

    // 하이로우세븐
    // 52 장의 포커 카드 사용
    // 게임 시작 후 5장의 카드를 오픈해서 보여줍니다.
    // 그리고 그 다음 1 장이 7보다 크다, 작다, 같다를 맞추는 게임

    struct tagCard
    {
        char*           szShape;  // 문자열 값
        int               nNumber; 
    };

    void InitCards(tagCard* cards);         // 전체 카드 초기화
    void Suffle(tagCard* cards);             // 카드 섞기
    void Print(tagCard* cards);              // 전체 카드 출력

    int main()
    {
        tagCard stCards[52];
        
        InitCards(stCards);
        Print(stCards);

        system("pause");

        return 0;
    }

    void InitCards(tagCard* cards)
    {
        for(E_SHAPE i = E_SPADE; i < E_MAX; i = (E_SHAPE)(i+1))
        //  enum 문이라 다르게 해야함   i++     ->      i = i+1     -> i = (E_SHAPE)(i+1)
        // enum문에 대한 증감은 강제 형 변환
        // enum문 활용 : 유지보수, 수정시 실수가 줄어듬
        {
            for (int j = 1; 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*)"♣";
                    break;
                case E_MAX:
                    break;
                }
                cards[i * 13 + j].nNumber = j + 1;
            }

        }
    }

    void Suffle(tagCard* cards)
    {

    }

    void Print(tagCard* cards)
    {
        for (int i = 0; i < 52; i++)
        {
            switch (cards[i].nNumber)
            {
            case 1:
                cout << cards[i].szShape << "A" << " ";
                break;
            case 11:
                cout << cards[i].szShape << "J" << " ";
                break;
            case 12:
                cout << cards[i].szShape << "Q" << " ";
                break;
            case 13:
                cout << cards[i].szShape << "K" << " ";
                break;
             default:
                 cout << cards[i].szShape << cards[i].nNumber<< " ";
                break;
            }

            if (i % 13 == 12) // 0 ~ 12
                cout << endl;
        }
    }


     

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

    위에 올려주신 코드 중 InitCards 함수에서

    for(E_SHAPE i = E_SPADE; i < E_MAX; i = (E_SHAPE)(i+1))
    {
        for (int j = 1; j < 13; j++)
     

    위의 2중 포문에서 j가 1부터 시작 합니다. 그러면

    cards[i * 13 + j]

    위의 인덱스 번호 계산시 j가 1부터 시작함으로 i가 0인경우 인덱스 번호가 1이 됩니다.

    결국 cards[0], cards[13], cards[26], cards[39] 이렇게 4개의 값은 설정이 되지 않고 있고 있는데 프린트 함수에서는 0부터 출력을 하기 때문에 할당되지 않은 메모리에 대한 접근으로 에러가 발생 하고 있는 것으로 확인 됩니다.

    반복문의 j = 1을 j = 0 으로 수정 하시면 정상 작동 됩니다.

     

    항상 열공하시고 공부하다가 또 막히는게 있을 때는 언제든지 질문 주시기 바랍니다.

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

댓글 2개
  • 컴공2018 [ 2021-08-10 16:25:46 ]
  • 헉 오타였네요... 이런 실수를 하다니 ㅠㅠ 감사합니다
  • 게임클래스 [ 2021-08-10 16:27:38 ]
  • 원래 기초 과정 공부할 때는 오타도 내보고 중괄호 실수도 해보고 세미콜론 실수도 해보고 그래야 나중에 실수도 줄고 실수를 하더라도 경험이 있어서 쉽게 찾아서 해결하고 그럴 수 있습니다. 다 공부하는 과정이니 자책하지 않으셔도 됩니다~