Как я могу изменить значения массива внутри функции, а затем использовать «новый» массив, где была вызвана функция - PullRequest
0 голосов
/ 09 ноября 2018

Так что для части моей домашней работы мне нужно сделать текстовую игру в стиле yahtzee. В данный момент я работаю над массивом для хранения значений костей. Моя проблема заключается в возможности передать массив в функцию для изменения значений, а затем снова использовать этот измененный массив. Изначально я хотел сделать это с помощью ссылок или указателей. У меня были проблемы с этим, и я не смог найти способ компиляции. Сегодня я поговорил со своим учителем, который сказал мне, что массивы можно обычно изменять внутри функции, а затем использовать снова, по сути говоря, что они передаются по ссылке автоматически.

Может кто-нибудь уточнить, что означает мой учитель, и если это правильно. Кроме того, какой метод вы бы порекомендовали, ребята. Ниже моя текущая реализация пытается использовать ссылки

/******************************************************
** Function: runGame
** Description: Runs game and keeps track of players
** Parameters: # of players
** Pre-Conditions: c is an integer from 1 to 9
** Post-Conditions:
******************************************************/
void runGame(int players) {
    Player p = new Player[players]; //needs to be deleted at the end
    int dice[] = { -1, -1, -1, -1, -1 };
    int category; // used to hold category chosen
    while (isGameOver(p)) {
        for (int i = 0; i < players; i++) {
            rollDice(dice); //uses reference
            p[i].scoreBoard= updateScore(p[i], dice);
            p[i].catsLeft--;
        }
    }
}

/******************************************************
** Function: rollDice
** Description: rolls dice, prints array and either rerolls
** Parameters: int[] dice
** Pre-Conditions:
** Post-Conditions:
******************************************************/
void rollDice(int (&dice) [5]) {
    int again;
    string indices; // indices of dice to reroll
    cout << "Your dice are" << endl;
    for (int i = 0; i < 5; i++) {
        dice[i] = rand() % (6) + 1;
        cout << dice[i];
    }
    for (int i = 0; i < 2; i++) {
        cout << "Roll again? Type anything except 0 to go again." << endl;
        cin >> again;

        if (again) {
            cout << "Type each index without a space that you would like to reroll";
            cin.ignore();
            getline(cin, indices);
            for (int i = 0; i < indices.length(); i++) {
                dice[(int)indices[i] - '0'] = rand() % (6) + 1;
            }
        }
        else
            break;
    }

}

В настоящее время я получаю ошибки компилятора, говорящие

ошибка: нет совпадения для «оператора []» (типы операндов - «Игрок» и «INT») p [i] .scoreBoard = updateScore (p [i], игра в кости);

И последующие для других раз, когда я пытаюсь использовать p [i]

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

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

#include "stdafx.h"
#include <iostream>
using namespace std;

void modifyArray(int * arr, int len)
{
    for (int i = 0; i < len; i++)
    {
        arr[i] += 1;
    }

}

void printArr(int *arr, int len)
{
    for (int i = 0; i < len; i++)
    {
        cout << arr[i];
    }
    cout << endl;
}

int main()
{
    int arr[5] = { 1,2,3,4,5 };
    cout << "Before :" << endl;
    printArr(arr, 5);    
    modifyArray(arr, 5);    
    cout << endl << "After : " << endl;
    printArr(arr, 5);    
    return 0;
}
0 голосов
/ 09 ноября 2018

Что означает ваш учитель, так это то, что если у вас есть указатель с целыми числами в буфере и с этим, всегда храните значения.

Пример:

int* p = new int[5];

Это создаст массив с 5 слотами, теперь каждый раз, когда вы его заполняете, он всегда будет меняться, есть некоторые вещи, которые могут немного отличаться, если вы делаете объектно-ориентированный, но в основном это будет так. Вы можете использовать это как глобальную переменную для тестирования.

Вы можете перемещаться по нему, написав либо p [желаемый номер слота]. Этот способ позволит вам использовать массив, другой способ - вернуть массив с числами (вместо void).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...