Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
11 / 11 / 7
Регистрация: 23.12.2015
Сообщений: 950
1

Почему массив всегда инициализирован нулями?

22.04.2017, 22:21. Показов 3180. Ответов 25
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Не могу понять, почему у меня массив всегда инициализирован нулями в методе check_ending.

Есть у меня класс Player в заголовочном файле, где я объявил все поля и методы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Player
{
protected:
 
    bool defeat_flag;
    
public:
    Player();
    
    int hits[10][10];
    int ships[10][10];
 
    void set(int deck, DataGridView ^dg);
    int place_ship(int, int, direction, int, DataGridView ^dg);
    void turn(Player& enemy, int turnX, int turnY, DataGridView ^dg);
    void turn(Player& enemy, DataGridView ^dg);
    void ship_init(DataGridView ^dg);
 
    int check_ending(Player& enemy);
};
И есть у меня сам метод check_ending в .cpp файле:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
int Player::check_ending(Player& enemy)
{
    int flag = 0;
    int human_flag = 0;
    int computer_flag = 0;
    for (int i = 0; i<10; i++)
    {
        for (int j = 0; j<10; j++)
        {
            if (human.ships[i][j] == 2)
                human_flag = 1; // у пользователя ещё остались неповреждённые корабли
            if (computer.ships[i][j] == 2)
                computer_flag = 1; // у компьютера ещё остались неповреждённые корабли
        }
    }
    if (human_flag == 0)
        flag = 2;
    if (computer_flag == 0)
        flag = 1;
    if (flag == 1)
    {       
        std::cout << "Player is winner!\n";
        return 2;
    }
    if (flag == 2)
    {
        std::cout << "Computer is winner!\n";
        return 2;
    }
}
Изначально массив ships инициализируется единицами, а затем в него добавляются двойки и тройки.

Но почему, когда я вызываю этот метод (check_ending) таким образом:

C++
1
2
3
4
5
6
7
8
9
10
11
12
void Player::turn(Player& enemy, int turnX, int turnY, DataGridView ^dg) {
    hits[turnX][turnY] = 1;
    if (enemy.ships[turnX][turnY] == filled)
    {
        enemy.ships[turnX][turnY] = damaged;    
        dg->Rows[turnX]->Cells[turnY]->Style->BackColor = Color::Red;
        check_ending(computer);
    }
    else {
        dg->Rows[turnX]->Cells[turnY]->Style->BackColor = Color::LightBlue;
    }
}
В методе check_ending массив ships вдруг оказывается инициализирован нулями?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.04.2017, 22:21
Ответы с готовыми решениями:

Почему массив изначально нулями не инициализируется?
Всем доброго вечера. Имеется проблема такая проблема: есть массив, в котором количество элементов...

Почему один массив заполняется нулями, а другой нет?
array&lt;Byte&gt;^inf_mass = gcnew array&lt;Byte&gt;(3016); char inf_mass_2; for (int p = 0; p &lt;3016; p++)...

Как узнать инициализирован ли массив?
Постоянно забываю, как это правильно делать. Здесь прочитал такой способ: Option Explicit ...

Проверить, был ли массив инициализирован
например я объявил массив не определенной длинны в моем случае так; Module Module1 Public...

25
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
22.04.2017, 22:26 2
Цитата Сообщение от DenKG Посмотреть сообщение
Изначально массив ships инициализируется единицами
Где?
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
22.04.2017, 22:27 3
Почему функция check_ending никак не использует свой параметр enemy?
Объекты computer и human глобальные? Где они хранятся?
1
11 / 11 / 7
Регистрация: 23.12.2015
Сообщений: 950
22.04.2017, 22:27  [ТС] 4
nd2,
C++
1
2
3
4
5
6
7
8
void Player::ship_init(DataGridView ^dg) {
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            ships[i][j] = 1;
            hits[i][j] = 0;
        }
    }
}
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
22.04.2017, 22:27 5
Цитата Сообщение от DenKG Посмотреть сообщение
C++
1
human.ships[i][j]
Что за human? Какое отношение имеет к enemy?
0
11 / 11 / 7
Регистрация: 23.12.2015
Сообщений: 950
22.04.2017, 22:32  [ТС] 6
Цитата Сообщение от nd2 Посмотреть сообщение
Что за human?
Объект класса Player

Добавлено через 55 секунд
Цитата Сообщение от likehood Посмотреть сообщение
Объекты computer и human глобальные? Где они хранятся?
Да, глобальные. В Player.cpp и в MyForm.h

Добавлено через 2 минуты
Цитата Сообщение от likehood Посмотреть сообщение
Почему функция check_ending никак не использует свой параметр enemy?
Да, в этом действительно моя ошибка. Но теперь я не знаю, как сделать так, чтобы проверялись оба объекта: computer и human
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
22.04.2017, 22:32 7
Цитата Сообщение от DenKG Посмотреть сообщение
Объект класса Player
Разберись, с каким объектом идёт работа в методах: с глобальным, с объектом, для которого этот метод вызывается, или с объектом, который в этот метод передаётся.
0
11 / 11 / 7
Регистрация: 23.12.2015
Сообщений: 950
22.04.2017, 22:38  [ТС] 8
Цитата Сообщение от nd2 Посмотреть сообщение
с объектом, который в этот метод передаётся.
Но теперь я не совсем понимаю, как проверить, грубо говоря, "какой объект победил".
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
22.04.2017, 23:16 9
Цитата Сообщение от DenKG Посмотреть сообщение
Но теперь я не совсем понимаю, как проверить, грубо говоря, "какой объект победил".
Чтобы ответить на этот вопрос, нужно разбираться с тем, как работает твоя программа. Кто это может сделать лучше, чем ты сам?
0
11 / 11 / 7
Регистрация: 23.12.2015
Сообщений: 950
22.04.2017, 23:23  [ТС] 10
Цитата Сообщение от nd2 Посмотреть сообщение
нужно разбираться с тем, как работает твоя программа.
Так тут вопрос-то всего в двух методах )
Каждый объект имеет свой массив кораблей (ships). И вот как теперь можно проверить, кто проиграл?
Здесь-то было всё понятно: human И computer.
C++
1
2
3
4
if (human.ships[i][j] == 2)
                human_flag = 1; // у пользователя ещё остались неповреждённые корабли
            if (computer.ships[i][j] == 2)
                computer_flag = 1; // у компьютера ещё остались неповреждённые корабли
Даже не знаю, как сказать...
Не понимаю, как теперь enemy разделить на два объекта?
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
22.04.2017, 23:27 11
Цитата Сообщение от DenKG Посмотреть сообщение
Так тут вопрос-то всего в двух методах )
Нет. Это тебе так кажется, потому что ты видишь весь код, и как, и что там взаимодействует.
По методам тебе ответы дали.
0
11 / 11 / 7
Регистрация: 23.12.2015
Сообщений: 950
22.04.2017, 23:28  [ТС] 12
nd2, ну глупо будет мне выкладывать весь проект )
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
22.04.2017, 23:30 13
Цитата Сообщение от DenKG Посмотреть сообщение
ну глупо будет мне выкладывать весь проект )
Я и не предлагал. Кому интересно копаться в твоём проекте?
Цитата Сообщение от DenKG Посмотреть сообщение
Каждый объект имеет свой массив кораблей (ships). И вот как теперь можно проверить, кто проиграл?
Здесь-то было всё понятно: human И computer.
Передавай в функцию два объекта.
0
11 / 11 / 7
Регистрация: 23.12.2015
Сообщений: 950
22.04.2017, 23:41  [ТС] 14
nd2, да, я передаю и второй объект из другой функции. Просто я спрашиваю, как в функции check_ending понять, какой из объектов сейчас проверяется.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
22.04.2017, 23:44 15
Цитата Сообщение от DenKG Посмотреть сообщение
да, я передаю и второй объект из другой функции. Просто я спрашиваю, как в функции check_ending понять, какой из объектов сейчас проверяется.
В каком смысле - какой? Какой написано в коде проверять, тот и проверяется.
0
11 / 11 / 7
Регистрация: 23.12.2015
Сообщений: 950
22.04.2017, 23:49  [ТС] 16
nd2, так enemy же.
Хорошо, по-другому. В функцию проверки из двух разных функций передаются два объекта поочередно: human и computer. У каждого объекта есть свой массив ships.
Как мне в функции check_ending проверить отдельно каждый объект и определить победителя(если в массиве человека, например, остались ячейки со значением 2, а у компьютера только 1 и 3, то человек побеждает) ?
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
23.04.2017, 00:02 17
Цитата Сообщение от DenKG Посмотреть сообщение
В функцию проверки из двух разных функций передаются два объекта поочередно: human и computer.
enemy, тогда, там зачем?
0
11 / 11 / 7
Регистрация: 23.12.2015
Сообщений: 950
23.04.2017, 05:54  [ТС] 18
nd2, а как тогда использовать эти объекты в этой функции?
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
23.04.2017, 08:29 19
Лучший ответ Сообщение было отмечено DenKG как решение

Решение

Цитата Сообщение от DenKG Посмотреть сообщение
Как мне в функции check_ending проверить отдельно каждый объект и определить победителя
Например так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int check_ending(Player &human, Player &computer)
{
    if (human.have_no_ships())
        return 1;
    else if (computer.have_no_ships())
        return 2;
    else
        return 0;
}
 
bool Player::have_no_ships()
{
    for (...)
        for (...)
        {
             if (ships[i][j] == 2)
                 return false;
        }
 
    return true;
}
1
11 / 11 / 7
Регистрация: 23.12.2015
Сообщений: 950
23.04.2017, 08:35  [ТС] 20
likehood, а разве have_no_ships() будет работать без объектов?
0
23.04.2017, 08:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.04.2017, 08:35
Помогаю со студенческими работами здесь

Как определить, что массив не инициализирован?
допустим есть код Dim a() As MyType ReDim a(2) Erase a() как после оператора ...

Как определить, инициализирован динамический массив или нет?
Собственно вопрос в теме: как определить на VBA инициализирован динамический массив или нет, пуст...

Массив типа t_arr размещен в динамической памяти по адресу р и инициализирован
Имеются описания Type t_arr=array of record d:1..31; m:1..12; y:integer end; car...

Какое значение принимает массив символов (char) если он не инициализирован ?
Добрый вечер. Хочу написать программу типа кто хочет стать миллионером. Если игрок не ввел имя при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru