Значение не увеличивается после добавления заявления? - PullRequest
1 голос
/ 12 октября 2011

У меня есть две функции, где я добавляю случайные числа к общему значению.

Проблема в том, что каждый раз, когда я вызываю функцию и печатаю сумму, она не прибавляется. Если он сгенерирует 2, он скажет, что итоговое значение равно 2. После этого, если я вызову его снова, и он сгенерирует 5, он скажет, что итоговое значение равно 5, и не добавит (должно быть 7, если это произошло).

Здесь все выглядит хорошо ...

int human(int humanscore)
{
    int diceRoll= rand() % 7;
    cout << "player rolled: ";
    humanscore+= diceRoll;
    cout << diceRoll;
    cout << "human score is: " << humanscore;
}

int computer(int compscore)
{
    int diceRoll= rand() % 7;
    cout << "computer rolled: ";
    compscore+= diceRoll;
    cout << diceRoll;
    cout << "computer score is: " << compscore;
}

Ответы [ 3 ]

9 голосов
/ 12 октября 2011

Вы изменяете значение внутренней копии аргумента, переданного функциям.Если вы хотите, чтобы изменение было выполнено для внешней переменной, замените определения функций так, чтобы они взяли ссылки: int& score.

Также обратите внимание, что rand() % 7 даст вам значение в диапазоне [0, 6].Кости имеют значения в диапазоне [1, 6], вместо них следует использовать 1 + rand() % 6.

* Обновление: *

Это можно сделать с помощью ссылок C ++:

int computer(int& compscore)
{
    ...
    compscore += diceRoll;
    ...
}

int var = 0;
computer( var );

Для этого объявления функция принимает фактическую переменную var в качестве аргумента, а изменения, сделанные в compscore внутри функции, отражаются в переменной var как compscore иvar для этого конкретного вызова являются просто псевдонимами к той же переменной.

В C тот же эффект достигается с помощью указателей:

int computer(int* compscore)
{
    ...
    *compscore += diceRoll;
    ...
}

int var = 0;
computer( &var );

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

1 голос
/ 12 октября 2011

Вы передаете свои параметры по значению. Это означает, что любые изменения в них отбрасываются после выполнения функции. Если вы хотите, чтобы ваши результаты сохранялись, у вас есть несколько вариантов. Вы можете передать параметры по ссылке, что в C ++ может быть сделано путем передачи указателя на счет. Вы можете заставить свою функцию возвращать новый счет, а затем передать возвращенное значение функции при следующем вызове. У вас также будет значительно менее желательное решение использования глобальных переменных.

1 голос
/ 12 октября 2011

Вы cout здесь diceRoll, так что текущий рулон будет напечатан только в отличие от общего.

Предполагая, что вы правильно печатаете рулон игральных костей, вам также нужно написать return humanscore; и return compscore; в конце этих функций, чтобы вернуться к новому результату.

...