Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Liori
4 / 4 / 5
Регистрация: 30.08.2012
Сообщений: 155
1

Почему происходит выход за границы?

10.05.2015, 21:07. Просмотров 569. Ответов 23
Метки нет (Все метки)

2 игрока берут из своих колод по 1-й карте. Т.е. достают элемент дека из начала дека. Так происходит, пока колода одного из игроков не станет пустой. Если достоинство карты 1-го игрока больше достоинства карты второго игрока, то в конец дека первого игрока ложится и своя карта, и карта второго игрока. Но происходит выход за границы


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int i = -1;
while (!Player1.empty() || !Player2.empty())
{
        i++;
        Player1.pop_front(); //взяли карту из 1-й колоды
        Player2.pop_front(); //взяли карту из 2-й колоды
        if (Player1[i].dostoinstvo > Player2[i].dostoinstvo)
        {
 
                Player1.push_back(Player1[i]); //добавили в конец 1-й колоды обе карты
                Player2.push_back(Player2[i]);
}
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2015, 21:07
Ответы с готовыми решениями:

Почему происходит выход за границы массива в функции Analyze()?
#include "Analyzer.h" #include "HashTable.h" #include <iostream> #include...

Не могу понять, почему не происходит выход из цикла
Здравствуйте, не могу понять почему не происходит выход из цикла Должен...

Выход за границы массива
Выхожу за пределы массива, но вот только не понимаю как. #include <iostream>...

Проверить на выход за границы массива
ПРивет, помогите пожалуйста, пишу класс - динамический массив, в перегрузке...

Выход итератора за границы list
почему у меня падает программа, когда пытаюсь ввести отсортированные элементы...

23
zss
Модератор
Эксперт С++
7186 / 6681 / 4230
Регистрация: 18.12.2011
Сообщений: 17,629
Завершенные тесты: 1
10.05.2015, 21:10 2
Цитата Сообщение от Liori Посмотреть сообщение
while (!Player1.empty() || !Player2.empty())
C++
1
while (!Player1.empty() && !Player2.empty())
0
Liori
4 / 4 / 5
Регистрация: 30.08.2012
Сообщений: 155
10.05.2015, 21:12  [ТС] 3
zss, всё равно выход за границы. К тому же, по условию проигрыш, именно когда колода (дек) одного из игроков станет пустой
0
ValeryS
Модератор
7264 / 5518 / 692
Регистрация: 14.02.2011
Сообщений: 18,691
10.05.2015, 21:23 4
Цитата Сообщение от Liori Посмотреть сообщение
К тому же, по условию проигрыш, именно когда колода (дек) одного из игроков станет пустой
одного!!!
а здесь
Цитата Сообщение от Liori Посмотреть сообщение
!Player1.empty() || !Player2.empty()
оба
если не пустой стек у одного или у другого
нужно вот так
C++
1
while (!(Player1.empty() || Player2.empty()))
если пустая хоть у одного то ИСТИНА инвертируется получаем ЛОЖЬ выходим из цикла
кстати
Цитата Сообщение от zss Посмотреть сообщение
while (!Player1.empty() && !Player2.empty())
полный аналог по Моргану
!a&&!b=!(a||b)
0
Liori
4 / 4 / 5
Регистрация: 30.08.2012
Сообщений: 155
10.05.2015, 21:36  [ТС] 5
ValeryS, но ошибка выхода за границы осталась

А нет, всё работает, спасибо!
0
ValeryS
Модератор
7264 / 5518 / 692
Регистрация: 14.02.2011
Сообщений: 18,691
10.05.2015, 21:43 6
а куда он денется ?
берешь то 1 карту, по програмистки 0
а кладешь то какую?
Цитата Сообщение от Liori Посмотреть сообщение
Player1[i]
i то при каждой итерации увеличивается
и если при первой итерации 0 то при второй 1 и так далее
пересмотри алгоритм

Добавлено через 2 минуты
Цитата Сообщение от Liori Посмотреть сообщение
дека первого игрока ложится и своя карта, и карта второго игрока.
а почему кладем разным игрокам?
Цитата Сообщение от Liori Посмотреть сообщение
C++
1
2
               Player1.push_back(Player1[i]); //добавили в конец 1-й колоды обе карты
                Player2.push_back(Player2[i]);
1
Liori
4 / 4 / 5
Регистрация: 30.08.2012
Сообщений: 155
10.05.2015, 21:53  [ТС] 7
ValeryS, подскажите, пожалуйста, никак не могу понять, а как же брать из дека и ложить одну и ту же карту?
0
zss
Модератор
Эксперт С++
7186 / 6681 / 4230
Регистрация: 18.12.2011
Сообщений: 17,629
Завершенные тесты: 1
10.05.2015, 22:00 8
Цитата Сообщение от Liori Посмотреть сообщение
Player1.pop_front(); //взяли карту из 1-й колоды
Функция pop_front() - возвращает значение верхней карты, его надо запоминать
C++
1
2
x1=Player1.pop_front();
x2=Player2.pop_front();
Кстати, очень неправильно, что вы обращаетесь внутрь дека через индекс:
Цитата Сообщение от Liori Посмотреть сообщение
Player1[i].dostoinstvo > Player2[i].dostoinstvo
Скорее всего, Вы имели ввиду вышеприведенные x1 и x2:
C++
1
2
3
4
5
if(x1>x2)
{
    Player1.push_back(x1); //добавили в конец 1-й колоды обе карты
    Player2.push_back(x2);   
}
1
ValeryS
Модератор
7264 / 5518 / 692
Регистрация: 14.02.2011
Сообщений: 18,691
10.05.2015, 22:02 9
Цитата Сообщение от Liori Посмотреть сообщение
пожалуйста, никак не могу понять, а как же брать из дека и ложить одну и ту же карту?
я вообще не могу понять как у тебя устроен Player1
ну например это стек классов
типа, не знаю какого
тогда что то типа такого
C++
1
2
3
4
5
6
7
8
9
10
11
12
while (!(Player1.empty() || Player2.empty()))
{
   
        card1=Player1.pop_front(); //взяли карту из 1-й колоды
        card2=Player2.pop_front(); //взяли карту из 2-й колоды
        if (card1 > card2)
        {
 
                Player1.push_back(card1); //добавили в конец 1-й колоды обе карты
                Player1.push_back(card2);
}
}
точнее могу сказать когда увижу реализацию Player1 и что в нем лежит
0
Liori
4 / 4 / 5
Регистрация: 30.08.2012
Сообщений: 155
10.05.2015, 22:23  [ТС] 10
ValeryS,
вот реализация Player1. через структуру карты и вектор этих структур

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
31
struct Card
{
int dostoinstvo; //достоинство карты
char mast; //масть
Card(char d, char m) { dostoinstvo = d; mast = m; }
};
 
vector<Card> Cards{
{ 6, 'B' },{ 6, 'T' },{ 6, 'P' },
{ 6, 'C' },{ 7, 'B' },{ 7, 'T' },
{ 7, 'P' },{ 7, 'C' },{ 8, 'B' },
{ 8, 'T' },{ 8, 'P' },{ 8, 'C' },
{ 9, 'B' },{ 9, 'T' },{ 9, 'P' },
{ 9, 'C' },{ 10, 'B' },{ 10, 'T' },
{ 10, 'P' },{ 10, 'C' },{ 11, 'B' }, // 11 - валет, 12 - дама, 13 - король, 14 - туз
{ 11, 'T' },{ 11, 'P' },{ 11, 'C' },
{ 12, 'B' },{ 12, 'T' },{ 12, 'P' },
{ 12, 'C' },{ 13, 'B' },{ 13, 'T' },
{ 13, 'P' },{ 13, 'C' },{ 14, 'B' },
{ 14, 'T' },{ 14, 'P' },{ 14, 'C' }
};
 
deque<Card> Player1, Player2; // колоды 1 и 2 игроков
 
//раздача карт
for (int i = 0; i < Cards.size(); i++)
{
         if (!(i % 2)) Player1.push_back(Cards[i]); //1-му игроку
 
         if (i % 2) Player2.push_back(Cards[i]); //2-му игроку
}
0
ValeryS
Модератор
7264 / 5518 / 692
Регистрация: 14.02.2011
Сообщений: 18,691
10.05.2015, 22:41 11
ну тогда наверно так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
while (!(Player1.empty() || Player2.empty()))
{
   
        Card card1=Player1.pop_front(); //взяли карту из 1-й колоды
        Card card2=Player2.pop_front(); //взяли карту из 2-й колоды
        if (card1.dostoinstvo > card2.dostoinstvo)
        {
 
                Player1.push_back(card1); //добавили в конец 1-й колоды обе карты
                Player1.push_back(card2);
 
        }
       else  if (card2.dostoinstvo > card1.dostoinstvo)
        {
 
                Player2.push_back(card1); //добавили в конец 1-й колоды обе карты
                Player2.push_back(card2);
 
        }
        
 
}
не понятно что делать если карты равны, а они будут равны, колоду перетасовать нужно
и вот здесь косячек
Цитата Сообщение от Liori Посмотреть сообщение
struct Card
{
int dostoinstvo; //достоинство карты
........
Card(char d, char m) { dostoinstvo = d; mast = m; }
};
что то одно выбрать нужно
1
Liori
4 / 4 / 5
Регистрация: 30.08.2012
Сообщений: 155
10.05.2015, 22:41  [ТС] 12
Спасибо большое
ValeryS, только выдает ошибку на строчках
C++
1
2
 Card card1=Player1.pop_front(); //взяли карту из 1-й колоды
 Card card2=Player2.pop_front(); //взяли карту из 2-й колоды
Error: не существует подходящего конструктора для преобразования из void в Card
0
ValeryS
Модератор
7264 / 5518 / 692
Регистрация: 14.02.2011
Сообщений: 18,691
10.05.2015, 22:42 13
Цитата Сообщение от Liori Посмотреть сообщение
какого типа должны быть card1 и card2?
такого
Цитата Сообщение от Liori Посмотреть сообщение
Card
0
Liori
4 / 4 / 5
Регистрация: 30.08.2012
Сообщений: 155
10.05.2015, 22:50  [ТС] 14
Спасибо большое
ValeryS, только выдает ошибку на строчках

C++
1
2
Card card1=Player1.pop_front(); //взяли карту из 1-й колоды
Card card2=Player2.pop_front(); //взяли карту из 2-й колоды
Error: не существует подходящего конструктора для преобразования из void в Card
0
ValeryS
Модератор
7264 / 5518 / 692
Регистрация: 14.02.2011
Сообщений: 18,691
10.05.2015, 22:52 15
а так
C++
1
Card card1=(Card)Player1.pop_front();
0
Liori
4 / 4 / 5
Регистрация: 30.08.2012
Сообщений: 155
10.05.2015, 22:56  [ТС] 16
ValeryS, всё равно та же ошибка - не существует подходящего конструктора для преобразования из void в Card
0
ValeryS
Модератор
7264 / 5518 / 692
Регистрация: 14.02.2011
Сообщений: 18,691
10.05.2015, 23:08 17
может тебе конструктор копирования нужно добавить в структуру
просто я с очередями мало работал

Добавлено через 6 минут
Цитата Сообщение от Liori Посмотреть сообщение
pop_front();
не подходит, он просто удаляет элемент из очереди
void pop_front() Front Insertion Sequence Removes the first element.
отсюда
http://www.sgi.com/tech/stl/Deque.html
сейчас поищем как это сделать
0
Liori
4 / 4 / 5
Регистрация: 30.08.2012
Сообщений: 155
10.05.2015, 23:12  [ТС] 18
ValeryS, спасибо большое! нашла вот функцию front(),которая не удаляет элемент, сейчас посмотрю, как будет работать
0
ValeryS
Модератор
7264 / 5518 / 692
Регистрация: 14.02.2011
Сообщений: 18,691
10.05.2015, 23:18 19
пока нашел это
C++
1
2
3
4
Card card1=Player1.front();//взяли карту из 1-й колоды
Card card2=Player2.front();//взяли карту из 2-й колоды
        Player1.pop_front(); //удалили карту из 1-й колоды
        Player2.pop_front(); //удалили карту из 2-й колоды
не понятно front() просто копирует значения или достает, т.е скопировал и удалил из очереди????
0
Liori
4 / 4 / 5
Регистрация: 30.08.2012
Сообщений: 155
10.05.2015, 23:24  [ТС] 20
ValeryS, Увы, ничего не происходит. Программа не выдает ошибок, по идее ж условие цикла выполняется, но не происходит ничего. Т.к. в конце я написала
C++
1
2
3
4
for (int i=0; i<Player2.size(); i++)
{
cout << Player2[i].dostoinstvo << " " << Player2[i].mast << endl;
}
но вывелись те же значения, что и были в самом начале в этом деке
мало того, в самом цикле после
C++
1
2
Card card1=Player1.pop_front(); //взяли карту из 1-й колоды
Card card2=Player2.pop_front(); //взяли карту из 2-й колоды
написала
C++
1
cout << "card1: " << card1.dostoinstvo << " " << card1.mast
но эта строчка вообще не вывелась

Добавлено через 3 минуты
front() всё-таки просто копирует значение: https://msdn.microsoft.com/uk-ua/library/s78e3as4.aspx
0
10.05.2015, 23:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2015, 23:24

Выход за границы. как исправить???
Суто проги в том, чтобы из 2х массивов создать третий элементами которого я...

Непонятная ошибка (выход за границы вектора)
Имеется следующий код // header.h #include &lt;windows.h&gt; #include...

Массивы: Проверка на выход за границы массива
Здравствуйте! Пишу код хождения коня по шахматной доске. Конь пока стоит на...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru