CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 2 of 2
  1. #1
    Join Date
    Feb 2012
    Posts
    2

    Problems with 'switch' and 'while'

    I'm having issues with my code. I am trying to build a game and it somehow gives errors when reaching the main loops. I will show to code and the errors I'm getting.

    Just a small note, the point when choosing option 1 and playing the game is that the game loops after the correct answer has been given and presents the player with a second random word, and keeps doing this until the player writes 'quit'.

    This is the code:
    Code:
    #include <iostream>
    #include <string>
    #include <cstdlib>
    #include <ctime>
    using namespace std;
    
    int main()
    {
        enum fields {WORD, HINT, NUM_FIELDS};
        const int NUM_WORDS = 3;
        const string WORDS[NUM_WORDS][NUM_FIELDS] =
        {
            {"jumble1", "First word."},
            {"jumble2", "Second word."},
            {"jumble3", "Third word."}
        };
        
        srand(static_cast<unsigned int>(time(0)));
        int choice = (rand() % NUM_WORDS);
        string theWord = WORDS[choice][WORD];
        string theHint = WORDS[choice][HINT];
        
        string jumble = theWord;
        int length = jumble.size();
        for (int i = 0; i < length; ++i)
        {
            int index1 = (rand() % length);
            int index2 = (rand() % length);
            char temp = jumble[index1];
            jumble[index1] = jumble[index2];
            jumble[index2] = temp;
        }
    
        int choice;
        bool choiceNotMade = true;
    
    	while (choiceNotMade)
    	{
    		cout << "[1] Play\n";
    		cout << "[2] Credits\n";
    		cout << "[3] Quit\n\n";
    
                    cout << "Your choice: ";
    		cin >> choice;
            }
        
                switch (choice)
                {
                case 1:
                    cout << "Unscramble the letters to make a word.\n";
                    cout << "Enter 'hint' for a hint.\n";
                    cout << "Enter 'quit' to quit the game.\n\n";
                    cout << "The jumble is: " << jumble;
    
                    string guess;
                    cout << "\n\nYour guess: ";
                    cin >> guess;
    
                    while ((guess != theWord) && (guess != "quit"))
                    {
                        if (guess == "hint")
                        {
                            cout << theHint;
                        }
                        else
                        {
                            cout << "That's not the right word.";
                        }
    
                        cout << "\n\nYour guess: ";
                        cin >> guess;
                    }
    
                    if (guess == theWord)
                    {
                        cout << "\nYou guessed it!\n";
                    }
    
                    cout << "\nThank you for playing.\n";
    
                    system("Pause");
                    choiceNotMade = false;
                    break;
    
                case 2:
                    cout << "\n\nThis game has been made by:\n\n";
                    choiceNotMade = false;
                    break;
    
                case 3:
                    cout << "Program will exit";
                    exit(1);
    
                default:
                    cout << "\nYou did not pick a valid option.\n\n";
                    choiceNotMade = false;
                    break;  
                
                    } 
        
        return 0;
    }

    And this is the error:
    Code:
    word_jumble.cpp: In function `int main()':
    word_jumble.cpp:32: error: redeclaration of `int choice'
    word_jumble.cpp:17: error: `int choice' previously declared here
    word_jumble.cpp:83: error: jump to case label
    word_jumble.cpp:53: error:   crosses initialization of `std::string guess'
    word_jumble.cpp:88: error: jump to case label
    word_jumble.cpp:53: error:   crosses initialization of `std::string guess'
    word_jumble.cpp:92: error: jump to case label
    word_jumble.cpp:53: error:   crosses initialization of `std::string guess'
    word_jumble.cpp:83: warning: destructor needed for `guess'
    word_jumble.cpp:83: warning: where case label appears here
    word_jumble.cpp:83: warning: (enclose actions of previous case statements requiring destructors in their own scope.)
    word_jumble.cpp:88: warning: destructor needed for `guess'
    word_jumble.cpp:88: warning: where case label appears here
    word_jumble.cpp:92: warning: destructor needed for `guess'
    word_jumble.cpp:92: warning: where case label appears here
    word_jumble.cpp:100:2: warning: no newline at end of file
    make[2]: *** [build/Debug/MinGW-Windows/word_jumble.o] Error 1
    make[1]: *** [.build-conf] Error 2
    make: *** [.build-impl] Error 2

  2. #2
    Join Date
    Dec 2002
    Posts
    1,050

    Re: Problems with 'switch' and 'while'

    1)
    int choice is declared twice in the same scope. Rename one or use only one
    2)
    Labels don't have scope but switch{} does. If you want to declare a variable for a label, use brackets.
    case (1)
    {
    std::string guess
    }
    Without brackets, there can be a jump over an initialization, and then a destructor call at the end of the switch{} which cannot be allowed. That's why you get the error for this.

    Hit the enter key at the end of the file. Some compilers require a newline at the end of the file.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured