invalid types 'const char[int]' for array subscript

Odpowiedz Nowy wątek
2019-07-10 21:59
0

Witam,
W celu przećwiczenia wykorzystywania wskaźników i referencji postanowiłam napisać prostą grę w konsoli (wisielec). Gra jest prawie skończona jednak kompilator pokazuje mi 2 błędy:

  • "error invalid type 'const char[int]' for array subscript"-
    zwracam się o pomoc, ponieważ zupełnie nie wiem w czym popełniłam błąd- stworzyłam wskaźnik (const char*secretPhrase) na tablicę znaków (type- const char),a następnie stworzyłam pentlę for, aby porównać kolejne elementy tablicy ze zmienną guess (type-char).

fragment kodu:

for(int i=0; i<secretPhraseLength; i++)
    {
        if(tolower(secretPhrase[i])==guess)
            noptrHiddenPhrase[i] = secretPhrase[i];
            found = true;
    }
    if(!found)
    {
        numberOfGuessesLeft--;
    }

dla pewności przeprowadziłam symulację tego tylko problemu w pustym programie (używając wskaźnika, tablicy const char i pętli for ) i w programie testowym wszystko działa jak należy.

-drugim błędem, jaki pokazuje kompilator jest: 'noptrHiddenPhrase was not declared i scope' .- oczywiście przed wywołaniem zdeklarowałam powyżej typ zmiennej. Co wiecej- w całym programie używałam jej kilka razy i przy wcześniejszych podobnych użyciach kompilator nie wskazał żadnego błędu.(noptr to skrót od no owning pointer).

Nie udaje mi się przesłać załącznika, więc zamieszczam też kod programu (struktura projektu; main.cpp, wisielec.cpp, nagłówki funkcji w wisielec.h)

#include <iostream>
#include <cstring>
#include <cctype>
#include "wisielec.h"

using namespace std;

const int IGNORE_CHARS = 256; //to do main
const char * INPUT_ERROR_STRING = "input error! Please, try again.";

//Play Game
void PlayGame()
{
    const int MAX_LENGTH_OF_SECRET_PHRASE = 256;
    const int MAX_NUMBER_OF_GUESSES = 6;

    char secretPhrase[MAX_LENGTH_OF_SECRET_PHRASE];
    char* noptrHiddenPhrase = nullptr;
    int nubmerOfGuessesLeft = MAX_NUMBER_OF_GUESSES;

    int secretPhraseLength = GetSecretPhrase(secretPhrase, MAX_LENGTH_OF_SECRET_PHRASE);//z t¹ lnijk¹ by³ problem

    noptrHiddenPhrase = MakeHiddenPhrase(secretPhrase, secretPhraseLength);

    DrawBoard(nubmerOfGuessesLeft, noptrHiddenPhrase);

    do
    {
        char guess = GetGuess();
        UpdateBoard(guess, noptrHiddenPhrase, secretPhrase, secretPhraseLength, nubmerOfGuessesLeft);
        DrawBoard(nubmerOfGuessesLeft, noptrHiddenPhrase);

    }while(isGameOver(nubmerOfGuessesLeft, noptrHiddenPhrase, secretPhraseLength));

    DisplayResult(secretPhrase, nubmerOfGuessesLeft);

    delete [] noptrHiddenPhrase;
}
    /*do
    {
        PlayGame();
    }while(WantToPlayAgain());

}*/ ///To muszę się jeszcze zastanowić, gdzie powinnam umieścić ;)

char GetGuess()
{
    return GetCharacter("Let's input your guess: ", INPUT_ERROR_STRING);
}

void UpdateBoard(char guess, char*noptrHiddenPhrase, const char secretPhrase, int secretPhraseLength, int&numberOfGuessesLeft)
{
    bool found = false;

    for(int i=0; i<secretPhraseLength; i++)
    {
        if(tolower(secretPhrase[i])==guess)
            noptrHiddenPhrase[i] = secretPhrase[i];
            found = true;
    }
    if(!found)
    {
        numberOfGuessesLeft--;
    }
}

bool isGameOver(int numberOfGuessesLeft, const char*optrHiddenPhrase, int secretPhraseLength)
{
    bool hasDash =  false;
    for(int i=0;i<secretPhraseLength;i++)
    {
        if(noptrHiddenPhrase[i]=='-')
        {
            hasDash = true;
            break;
        }
    }return numberOfGuessesLeft==0 || !hasDash;
}

void DisplayResult(const char*secretPhrase, int numberOfGuessesLeft)
{
    if(numberOfGuessesLeft>0)
    {
        cout<<"You got it! The phrase was: "<<secretPhrase<<endl;
    }
    else
    {
        cout<<"You didn't get it...The phrases was: "<<secretPhrase<<endl;
    }
}

bool WantToPlayAgain()
{
    const char validInputs[] = {'y','n'};
    char response = GetCharacter("Would you like to play again? (y/n)", INPUT_ERROR_STRING, validInputs, 2);
    return response == 'y';
}

//Get Secret Phrase
int GetSecretPhrase(char secretPhrase[], int maxlength)
{
    bool failure;
    int length;
    do
    {
        failure = false;
        cout<<"Enter the secret phrase: ";
        cin.get(secretPhrase, maxlength);

        if(cin.fail())
        {
            cin.clear();
            cin.ignore(IGNORE_CHARS, '/n');
            cout << INPUT_ERROR_STRING << endl;
            failure = true;
        }
        else
        {
            length = strlen(secretPhrase);

            if(length==0)
            {
                cout<<"You didn't enter any characters. Please, enter a word.";
                failure = true;
            }
        }

    }while(failure);
    return length;
}
//Make Hidden Phrase
char*MakeHiddenPhrase(const char*secretPhrase, int secretPhraseLength)
{
    char* hiddenPhrase = new char[secretPhraseLength+1];
    for(int i=0;i<secretPhraseLength;i++)
    {
        if(secretPhrase[i] != ' ')
        {
            hiddenPhrase[i]='-';
        }
        else hiddenPhrase[i] = ' ';
    }
    hiddenPhrase[secretPhraseLength]='\0';
    return hiddenPhrase;
}
//Draw Board
void DrawBoard(int numberOfGuessesLeft, const char* noptrHiddenPhrase)
{
    switch(numberOfGuessesLeft)
    {
    case 0:
    {
        cout<<" +---+"<<endl;
        cout<<" |   |"<<endl;
        cout<<" |   O"<<endl;
        cout<<" |  /|\\"<<endl;
        cout<<" |  / \\"<<endl;
        cout<<"-+-"<<endl<<endl;
    }
    case 1:
    {
        cout<<" +---+"<<endl;
        cout<<" |   |"<<endl;
        cout<<" |   O"<<endl;
        cout<<" |  /|\\"<<endl;
        cout<<" |  / "<<endl;
        cout<<"-+-"<<endl<<endl;
    }break;

    case 2:
    {
        cout<<" +---+"<<endl;
        cout<<" |   |"<<endl;
        cout<<" |   O"<<endl;
        cout<<" |  /|\\"<<endl;
        cout<<" |  "<<endl;
        cout<<"-+-"<<endl<<endl;
    }break;
    case 3:
    {
        cout<<" +---+"<<endl;
        cout<<" |   |"<<endl;
        cout<<" |   O"<<endl;
        cout<<" |  /|"<<endl;
        cout<<" |  "<<endl;
        cout<<"-+-"<<endl<<endl;
    }break;
    case 4:
    {
        cout<<" +---+"<<endl;
        cout<<" |   |"<<endl;
        cout<<" |   O"<<endl;
        cout<<" |   |"<<endl;
        cout<<" |  "<<endl;
        cout<<"-+-"<<endl<<endl;
    }break;
    case 5:
    {
        cout<<" +---+"<<endl;
        cout<<" |   |"<<endl;
        cout<<" |   O"<<endl;
        cout<<" |  "<<endl;
        cout<<" |  "<<endl;
        cout<<"-+-"<<endl<<endl;
    }break;
    case 6:
    {
        cout<<" +---+"<<endl;
        cout<<" |   |"<<endl;
        cout<<" |   "<<endl;
        cout<<" |  "<<endl;
        cout<<" |  "<<endl;
        cout<<"-+-"<<endl<<endl;
    }break; default: break;
    }cout<<"Secret Phrase: "<<noptrHiddenPhrase<<endl<<endl;
}

char GetCharacter(const char* prompt, const char*error)
{
    char input;
    bool failure;

    do
    {
        failure=false;
        cout<<prompt;
        cin>>input;

        if(cin.fail())
        {
            cin.clear();
            cin.ignore(IGNORE_CHARS, '/n');
            cout << error << endl;
            failure=true;
        }
        else
        {
            cin.ignore(IGNORE_CHARS, '/n');

            if(isalpha(input))
            {
                input = tolower(input);
            }
            else
            {
                cout<<error<<endl;
                failure = true;
            }
        }
    }while(failure); return input;
}

char GetCharacter(const char* prompt, const char* error, const char validInput[], int validInputLength)
{
    char input;
    bool failure;

    do
    {
        failure=false;
        cout<<prompt;
        cin>>input;

        if(cin.fail())
        {
            cin.clear();
            cin.ignore(IGNORE_CHARS, '/n');
            cout << error << endl;
            failure=true;
        }
        else
        {
            cin.ignore(IGNORE_CHARS, '/n');

            if(isalpha(input))
            {
                input = tolower(input);

                for (int i=0;i<validInputLength;i++)
                {
                    if(input==validInput[i])
                    {
                        return input;
                    }
                }
            }
            cout<<error<<endl;
            failure=true;
        }
    }while(failure); return input;
}

main.cpp:

#include <iostream>
#include "wisielec.h"

using namespace std;

int main()
{
    const int IGNORE_CHARS = 256; //to do main
    const char * INPUT_ERROR_STRING = "input error! Please, try again.";

    PlayGame();
    return 0;
}

wisielec.h:

#include <iostream>

using namespace std;

void PlayGame();
bool WantToPlayAgain();
char*MakeHiddenPhrase(const char*secretPhrase, int secretPhraseLength);
void DrawBoard(int numberOfGuessesLeft, const char* noptrHiddenPhrase);
int GetSecretPhrase(char secretPhrase[], int maxlength);
char GetGuess();
void UpdateBoard(char guess, char*noptrHiddenPhrase, const char*secretPhrase, int secretPhraseLength, int&numberOfGuessesLeft);
bool isGameOver(int numberOfGuessesLeft, const char*optrHiddenPhrase, int secretPhraseLength);
void DisplayResult(const char*secretPhrase, int numberOfGuessesLeft);

char GetCharacter(const char* prompt, const char*error);
char GetCharacter(const char* prompt, const char*error, const char validInput[], int validInputLength);

Niestety nie mam żadnego pomysłu jak to naprawić. Nie bardzo mam do kogo się zwrócić o pomoc, a bardzo frustrującym byłoby porzucić niedziałającą, prawie skończoną grę :-(

Będę wdzięczna za każdą odpowiedź :-)

edytowany 7x, ostatnio: furious programming, 2019-07-10 22:20
Kod wstawiamy w znaczniki kolorujące składnię – ```c++ przed kodem, a po kodzie samo ``` – pamiętaj o tym. - furious programming 2019-07-10 22:21

Pozostało 580 znaków

2019-07-10 22:17
1

W isGameOver używasz noptrHiddenPhrase a nie przekazałaś go jako argumentu, stąd błąd.
A twoje const char secretPhrase, po którym chcesz indeksować [] to jest JEDEN CHAR. Może to miał być const char*, szczególnie że tam gdzie wołasz tą funkcje ta zmienna to char[]


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 2x, ostatnio: Shalom, 2019-07-10 22:19

Pozostało 580 znaków

2019-07-10 22:36
0

Ojej😳
Z oboma punktami miałeś rację 😅
Dziękuję bardzo ;-)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 0, botów: 1

Robot: CCBot