Недопустимые типы int [int] для индекса массива в многомерном массиве c++

При выполнении моего курсового проекта карточной игры я получил ошибку
Недопустимые типы `int [int] 'для индекса массива'
Вот код:

#include <iostream>
#include <stdlib.h>
#include <time.h>

int randomize(int, int);
int* generateCardNumber(int[5]);
int* generateCardLogo(int, int[13][4], int[5]);
int* compareCard(int[5], int[5], int[5], int[5], int[13][4]);
int printResult(int[5]);
void showCard(int, int[5], int[5], int[5], int[5]);
void printCard(int[5], int[5]);


using namespace std;

int main()
{
    srand(time(NULL));
    int player1Number[5], player1Logo[5];
    int *number1, *logo1;
    int player2Number[5], player2Logo[5];
    int *number2, *logo2;
    int cardInfo[13][4];
    int **card;
    char answer;

   do
   {
       int playerInput;
       int d, c, r;
       int player1Score, player2Score;
       cout<<"Welcome to the card game!"<<endl;
       cout<<" Choose player{1: Player 1; 2: Player 2} : ";
       cin>>playerInput;
       cout<<endl;

       do
       {
            cout<<"Press d to deal card :";
       }while(d != 'd');
       number1  = generateCardNumber(player1Number);
       logo1    = generateCardLogo(1,cardInfo, player1Number);
       for (int i = 0; i<5; i++)
       {
           cardInfo[player1Number[i]][player1Logo[i]] = 1;
       }
       number2  = generateCardNumber(player2Number);
       logo2        = generateCardLogo(2,cardInfo, player2Number);
       for (int i = 0; i<5; i++)
       {
           cardInfo[player2Number[i]][player2Logo[i]] = 1;
       }
       showCard(playerInput,player1Number,player1Logo,
       player2Number,player2Logo);

       do
       {
          cout<<"Press c to compare card :";
       }while(c != 'c');
       *card = compareCard(player1Number,player1Logo,
       player2Number,player2Logo,cardInfo);
       for (int i = 0; i<5; i++)
       {
           if(cardInfo[player1Number[i]][player1Logo[i]] = -1)
           {
               player1Number[i] = -1;
               player1Logo[i] = -1;
           }
           else if(cardInfo[player2Number[i]][player2Logo[i]] = -1)
           {
               player2Number[i] = -1;
               player2Logo[i] = -1;
           }
       }

       showCard(playerInput,player1Number,
       player1Logo,player2Number,player2Logo);

       do
       {
           cout<<"Press r to show result :";
       }while(r != 'r');
       if(playerInput == 1)
       {
           cout<<"Player1 (You):        ";
           player1Score = printResult(player1Number);
           cout<<"Player2 (Computer):   ";
           player2Score = printResult(player2Number);
           if(player1Score > player2Score) cout<<"You WIN!"<<endl;
           else cout<<"Computer WIN!"<<endl;
       }
       else if(playerInput == 2)
       {
           cout<<"Player1 (Computer):   ";
           player1Score = printResult(player1Number);
           cout<<"Player2 (You):        ";
           player2Score = printResult(player2Number);
           if(player2Score > player1Score) cout<<"You WIN!"<<endl;
           else cout<<"Computer WIN!"<<endl;
       }
       cout<<"Do you want to play again? (y/n)"<<endl;
       cin>>answer;     
   }while(answer == 'Y' || answer == 'y');
}

int randomize (int x, int y)
{
   return (rand()%y + x);
}

int* generateCardNumber (int numberArray[5])
{
    int arrayStoring[13] = {0,0,0,0,0,0,0,0,0,0,0,0,0};
    for (int i = 0; i<5; i++)
    {
        do
        {
            numberArray[i] = randomize(1,13);   
        }while (arrayStoring[numberArray[i]] == 1);
        arrayStoring[numberArray[i]] = 1;
    }
    return numberArray;
}
int* generateCardLogo (int turn, int cardInfo[4][13], int player2Number[5])
{
    int logoArray[5];
    if(turn == 1)
    {
        for (int i = 0; i<5; i++)
        {
            logoArray[i] = randomize(1,4);
        }
        return logoArray;
    }
    else if(turn == 2)
    {
        for (int i = 0; i<5; i++)
        {
            do
            {
                logoArray[i] = randomize(1,4);  
            }while (cardInfo[player2Number[i]][logoArray[i]] == 1);         
        }
        return logoArray;
    }   
}

int** compareCard(int player1Number, int player1Logo, int player2Number, int player2Logo, int cardInfo)
{
    for(int i=0; i<5 ; i++)
    {
        for(int j=0; j<5 ; j++)
        {
            if(player1Number[i] == player2Number[j])
            {
                if(player1Logo[i] < player2Logo[j]) cardInfo[player1Number[i]][player1Logo[i]] = -1;
                else if(player1Logo[i] > player2Logo[j]) cardInfo[player2Number[i]][player2Logo[i]] = -1;
                break;
            }
        }
    }
    return cardInfo;
}

int printResult (int playerNumber)
{
    int playerScore = 0;
    for (int i = 0; i<5; i++)
    {
        if(playerNumber[i] == -1) break;
        else if(playerNumber[i] == 0)
        {
            playerScore += 15;  
            cout<<"15 ";
        }
        else if(playerNumber[i] > 0 && playerNumber[i] < 10 )
        {
            playerScore += (playerNumber[i] + 1);
            cout<< (playerNumber[i] + 1) <<" ";
        }
        else if(playerNumber[i] >= 10)
        {
            playerScore += 12;
            cout<<"12 ";
        }

        if(i<4) cout<<"+ ";
        else if(i==4)
        {
            cout<<"= "<<playerScore<<" points";
        }
    }
    return playerScore;
}

void printCard (int numberArray[5], int logoArray[5])
{
    for (int i = 0; i<5; i++)
    {
        switch(numberArray[i])
        {
            case -1 :
                cout<<"<fold> ";
                break;
            case 0 :
                cout<<"Ace ";
                break;
            case 1 :
                cout<<"2 ";
                break;
            case 2 :
                cout<<"3 ";
                break;
            case 3 :
                cout<<"4 ";
                break;
            case 4 :
                cout<<"5 ";
                break;
            case 5 :
                cout<<"6 ";
                break;
            case 6 :
                cout<<"7 ";
                break;
            case 7 :
                cout<<"8 ";
                break;
            case 8 :
                cout<<"9 ";
                break;
            case 9 :
                cout<<"10 ";
                break;
            case 10 :
                cout<<"Jack ";
                break;
            case 11 :
                cout<<"Queen ";
                break;
            case 12 :
                cout<<"King ";
                break;
        }
        switch(logoArray[i])
        {
            case -1:
                break;
            case 0:
                cout<<"Diamond  ";
                break;
            case 1:
                cout<<"Club     ";
                break;
            case 2:
                cout<<"Heart    ";
                break;
            case 3:
                cout<<"Spade    ";
                break;  
        }   
    }
}
void showCard (int playerInput, int player1Number, int player1Logo, int player2Number, int player2Logo)
{
    if(playerInput == 1)
    {
        cout<<"Player1 (You):"<<endl;
        printCard(player1Number, player1Logo);
        cout<<"Player2 (Computer):"<<endl;
        printCard(player2Number, player2Logo);
    }
    else if(playerInput == 2)
    {
        cout<<"Player1 (Computer):"<<endl;
        printCard(player1Number, player1Logo);
        cout<<"Player2 (You):"<<endl;
        printCard(player2Number, player2Logo);
    }
}

Честно говоря, я еще новичок в программировании. Итак, я не знал, что не могу вернуть весь массив из функции. После поиска подсказки я обнаружил, что могу использовать указатель для возврата массива из функции. Когда я пытаюсь исправить код, появляется эта ошибка, и я не знал, что мне нужно исправить. Ошибка продолжает появляться, когда я пытаюсь использовать массив из параметра функции, например, этот

if(player1Number[i] == player2Number[j])<br/>

из функции

int** compareCard(int player1Number, int player1Logo, int player2Number, int player2Logo, int cardInfo)

и далее.

Может ли кто-нибудь помочь мне разобраться в этом? Мы будем очень признательны за исправление кода. Большое спасибо! (Извини, если мой английский плохой)

Как указано в ошибке, вы пытаетесь использовать целочисленную переменную в качестве массива. Что ему делать?

Sami Kuhmonen 26.10.2018 08:56
int printResult (int playerNumber) -> playerNumber имеет тип int, а не array of int -> if(playerNumber[i] == -1) break; недействителен. Как и многие другие.
duong_dajgja 26.10.2018 09:01

Вы бы исправили многие свои ошибки, если бы добавили несколько псевдонимов типов и использовали их последовательно, using hand = std::array<int, 5>; using deck = std::array<std::array<int, 4>, 13>;

Caleth 26.10.2018 12:22

@SamiKuhmonen спасибо за подсказку. Мне нужно повторно объявить параметр как массив при реализации функции.

Stefanus Christian 26.10.2018 16:13
0
4
94
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы объявляете compareCard с кучей массивов (например, указатели int) в качестве параметров:

int* compareCard(int[5], int[5], int[5], int[5], int[13][4]);

Однако затем вы реализуете его, используя целые числа (не указатели) в качестве параметров:

int** compareCard(int player1Number, int player1Logo, int player2Number, int player2Logo, int cardInfo)
{
    for(int i=0; i<5 ; i++)

Вы также используете их как массивы:

if(player1Logo[i] < player2Logo[j]) cardInfo[player1Number[i]][player1Logo[i]] = -1;

Кроме того, тип возвращаемого значения неверен. Вы объявляете его как int*, но затем реализуете как int**. Вы должны убедиться, что подпись вашей функции совпадает. Похоже, что взятие подписи объявления и ее применение к определению должно исправить эту ошибку времени компиляции.

Выдает ли ваш компилятор какие-либо предупреждения для этих объявлений функций? Если нет, посмотрите, можете ли вы сделать его более строгим с предупреждениями. Получение правильных предупреждений о потенциальных ошибках значительно повышает эффективность отладки.

Спасибо за ответ! Я забываю объявить параметры как массив, возможно, размышления о том, как передать массив, утомляют меня и немного беспечны. Большое спасибо за решение!

Stefanus Christian 26.10.2018 16:17

Без проблем. Рад, что помог.

Blaze 26.10.2018 16:21

извините, но если вы не против, можете ли вы помочь еще раз? Я уже исправил свой код, и осталась только одна ошибка: «Невозможно преобразовать 'int (*) [4]' в 'int **' взамен». Эта ошибка возникает из-за возврата cardInfo из функции compareCard

Stefanus Christian 26.10.2018 16:28

В этой функции вы возвращаете указатель на весь 2D-массив cardInfo, я думаю, это не то, что вы планировали.

Blaze 26.10.2018 16:37

я хочу вернуть 2D-массив cardInfo. есть ли способ вернуть 2D-массив из функции? Я думаю, что он работает так же, как 1D-массив, но, видимо, это не сработало.

Stefanus Christian 26.10.2018 17:22

Он работает аналогично, но тогда у вас есть другой уровень косвенности, потому что 2D-массив представлен int**, а 1D-массив - int*.

Blaze 29.10.2018 09:31

Другие вопросы по теме