Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Liori
4 / 4 / 1
Регистрация: 30.08.2012
Сообщений: 155
#1

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

10.05.2015, 21:07. Просмотров 537. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Почему происходит выход за границы? (C++):

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

Выход за границы массива - C++
Выхожу за пределы массива, но вот только не понимаю как. #include <iostream> #include <fstream> using namespace std; const...

Выход за границы. как исправить??? - C++
Суто проги в том, чтобы из 2х массивов создать третий элементами которого я вляются совпавшие элементы первых 2х Например: 1 2 3 4 5 ...

Выход итератора за границы list - C++
почему у меня падает программа, когда пытаюсь ввести отсортированные элементы в другой list ??? list<char>ch; list<char>rev; ...

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

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

23
zss
Модератор
Эксперт С++
6928 / 6490 / 2182
Регистрация: 18.12.2011
Сообщений: 17,105
Завершенные тесты: 1
10.05.2015, 21:10 #2
Цитата Сообщение от Liori Посмотреть сообщение
while (!Player1.empty() || !Player2.empty())
C++
1
while (!Player1.empty() && !Player2.empty())
0
Liori
4 / 4 / 1
Регистрация: 30.08.2012
Сообщений: 155
10.05.2015, 21:12  [ТС] #3
zss, всё равно выход за границы. К тому же, по условию проигрыш, именно когда колода (дек) одного из игроков станет пустой
0
ValeryS
Модератор
7007 / 5345 / 527
Регистрация: 14.02.2011
Сообщений: 18,038
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 / 1
Регистрация: 30.08.2012
Сообщений: 155
10.05.2015, 21:36  [ТС] #5
ValeryS, но ошибка выхода за границы осталась

А нет, всё работает, спасибо!
0
ValeryS
Модератор
7007 / 5345 / 527
Регистрация: 14.02.2011
Сообщений: 18,038
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 / 1
Регистрация: 30.08.2012
Сообщений: 155
10.05.2015, 21:53  [ТС] #7
ValeryS, подскажите, пожалуйста, никак не могу понять, а как же брать из дека и ложить одну и ту же карту?
0
zss
Модератор
Эксперт С++
6928 / 6490 / 2182
Регистрация: 18.12.2011
Сообщений: 17,105
Завершенные тесты: 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
Модератор
7007 / 5345 / 527
Регистрация: 14.02.2011
Сообщений: 18,038
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 / 1
Регистрация: 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
Модератор
7007 / 5345 / 527
Регистрация: 14.02.2011
Сообщений: 18,038
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 / 1
Регистрация: 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
Модератор
7007 / 5345 / 527
Регистрация: 14.02.2011
Сообщений: 18,038
10.05.2015, 22:42 #13
Цитата Сообщение от Liori Посмотреть сообщение
какого типа должны быть card1 и card2?
такого
Цитата Сообщение от Liori Посмотреть сообщение
Card
0
Liori
4 / 4 / 1
Регистрация: 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
Модератор
7007 / 5345 / 527
Регистрация: 14.02.2011
Сообщений: 18,038
10.05.2015, 22:52 #15
а так
C++
1
Card card1=(Card)Player1.pop_front();
0
10.05.2015, 22:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2015, 22:52
Привет! Вот еще темы с ответами:

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

Исправить выход за границы двумерного динамического массива - C++
Уважаемые форумчане, помогите, проблема в том, что пишет ошибку после выполнения функции вывода массива, вот код //распечатка матрицы ...

Не удаётся устранить необработанное исключение(выход за границы вектора) - C++
Помогите пожалуйста, по мне так всё правильно и аналогичная функция в другом месте работает, но всё равно выдает ошибку void...

При вызове функции необработанное исключение, выход за границы массива - C++
bool checkprocessed(point data,int xx,int yy,int wind) { bool mark=false; int s=0; for(int k=xx; k&lt;xx+wind;k++){ for(int...


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

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

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