Суббота, 16 Ноября 2024, 21:48

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
Вопрос-Ответ (C++)
KornivalДата: Воскресенье, 04 Сентября 2011, 19:10 | Сообщение # 1
The Witcher
Сейчас нет на сайте
Чтобы не создавать отдельную тему на каждый глупый вопрос, предлагаю задавать их здесь.

Saitei: все вопросы по С задаём в теме Вопрос-Ответ (С). Благодарю за внимание!
НохчиДата: Понедельник, 09 Апреля 2012, 01:33 | Сообщение # 241
заслуженный участник
Сейчас нет на сайте
Я твой код практически скопипастил, но у меня работает)

Quote (Aikidos)
for (std::map < int, int >::iterator It = myMap.begin(); It != myMap.end(); ++ It)

Попробуй поменять на
Code
for (std::map < int, int >::iterator It = myMap.begin(); It != myMap.end(); It++)

Могу проверить на gcc, если хочешь.


Многие вопросы по Windows отпадут, если посмотреть тут
AikidosДата: Понедельник, 09 Апреля 2012, 01:38 | Сообщение # 242
постоянный участник
Сейчас нет на сайте
Quote (Нохчи)
Попробуй поменять на

Менял. Результат один и тот же.

Quote (Нохчи)
Могу проверить на gcc, если хочешь.

Проверь.

Странно вообще. Глюк студии/стандарта? Тупость какая-то.


Ты вышел в поле. Ты куришь гашиш. Ты видишь машину. Ты медведь. Ты горишь.
НохчиДата: Понедельник, 09 Апреля 2012, 01:49 | Сообщение # 243
заслуженный участник
Сейчас нет на сайте
Quote (Aikidos)
Проверь.

Проверил. Работает правильно.
Почему работает на 2008 и не работает на 2010 непонятно, реализация-то все-равно лежит в msvcrt?

Добавлено (09.04.2012, 01:49)
---------------------------------------------

Quote (Нохчи)
реализация-то все-равно лежит в msvcrt?

Хотя нет, там С функции. Похоже это студия wink


Многие вопросы по Windows отпадут, если посмотреть тут
ЙакудДата: Понедельник, 09 Апреля 2012, 01:58 | Сообщение # 244
участник
Сейчас нет на сайте
Aikidos, что именно у тебя не работает? Вроде бы все логично и в 10 работает.

"Хороший художник – копирует, гениальный – ворует!" — Pablo Picasso
.blanco 2.0


Сообщение отредактировал Йакуд - Понедельник, 09 Апреля 2012, 01:59
AikidosДата: Понедельник, 09 Апреля 2012, 02:00 | Сообщение # 245
постоянный участник
Сейчас нет на сайте
Quote (Йакуд)
Aikidos, что именно у тебя не работает?

Клик.


Ты вышел в поле. Ты куришь гашиш. Ты видишь машину. Ты медведь. Ты горишь.
НохчиДата: Понедельник, 09 Апреля 2012, 02:09 | Сообщение # 246
заслуженный участник
Сейчас нет на сайте
Йакуд, скомпилируй это и посмотри получится ли вечный цикл
Code

#include <map>

int main()
{
   std::map < int, int > myMap;    
    for (int i = 0; i < 10; i ++)   
    {   
     myMap[i] = i;   
    }

   std::map < int, int >::iterator beg = myMap.begin();
   for (std::map < int, int >::iterator It = myMap.begin(); It != myMap.end(); ++ It)   
   {   
    if (It->first == 5)   
    {
     It = myMap.begin();   
     if(beg == It) break;
    }
   }
}


Многие вопросы по Windows отпадут, если посмотреть тут

Сообщение отредактировал Нохчи - Понедельник, 09 Апреля 2012, 02:09
AikidosДата: Понедельник, 09 Апреля 2012, 02:16 | Сообщение # 247
постоянный участник
Сейчас нет на сайте
Quote (Нохчи)
Йакуд, скомпилируй это и посмотри получится ли вечный цикл

Нет. Вечный цикл не получился.


Ты вышел в поле. Ты куришь гашиш. Ты видишь машину. Ты медведь. Ты горишь.

Сообщение отредактировал Aikidos - Понедельник, 09 Апреля 2012, 02:16
НохчиДата: Понедельник, 09 Апреля 2012, 02:18 | Сообщение # 248
заслуженный участник
Сейчас нет на сайте
Quote (Aikidos)
Нет. Вечный цикл не получился.

Значит It = myMap.begin() вернуло итератор на первый элемент, не?


Многие вопросы по Windows отпадут, если посмотреть тут
ЙакудДата: Понедельник, 09 Апреля 2012, 02:26 | Сообщение # 249
участник
Сейчас нет на сайте
Нохчи, это явно не то.. В момент It = myMap.begin(), It дейстьвительно становится итератором на первый элемент. но после того как пройдет ещё один оборот цикла, увеличивается этот итератор сразу... В этом вся ошибка.. Ща попробую кое-что сделать..

Добавлено (09.04.2012, 02:26)
---------------------------------------------
Вот, если сделать так, то все прекрасно работает..

Code
for(std::map <int, int>::iterator It = myMap.begin(); It != myMap.end();)
{
   if(It->first == 5)
   {
     It = myMap.begin();
   }
   else
     It++;
}


"Хороший художник – копирует, гениальный – ворует!" — Pablo Picasso
.blanco 2.0


Сообщение отредактировал Йакуд - Понедельник, 09 Апреля 2012, 02:30
AikidosДата: Понедельник, 09 Апреля 2012, 02:33 | Сообщение # 250
постоянный участник
Сейчас нет на сайте
Quote (Йакуд)
Вот, если сделать так, то все прекрасно работает..

Хитро. Спасибо за помощь. smile

Хотя всё равно интересно что они там сделали, что такая вещь имеет место быть.


Ты вышел в поле. Ты куришь гашиш. Ты видишь машину. Ты медведь. Ты горишь.
ЙакудДата: Понедельник, 09 Апреля 2012, 02:39 | Сообщение # 251
участник
Сейчас нет на сайте
Aikidos, Нет, дело не в библиотеке, а в понимании что реально творится у тебя в коде. Давай разберем по полочкам все.. Вместо возьмем число 3, для краткости..
1) It = (0, 0). It->first == 3? No. Начало -> увеличить +1
2) It = (1, 1). It->first == 3? No. Начало -> увеличить +1
3) It = (2, 2). It->first == 3? No. Начало -> увеличить +1
4) It = (3, 3). It->first == 3? Yes. It = (0, 0) Начало -> увеличить +1
5) Вот на этом месте, ты хочешь чтобы у тебя возникло (0, 0). Но в следующий момент, когда ты обновил итератор, у тебя же счетчик увеличился! Тем кодом что привел я, мы предотвратили момент увеличения итератора в момент перехода на начало.


"Хороший художник – копирует, гениальный – ворует!" — Pablo Picasso
.blanco 2.0
AikidosДата: Понедельник, 09 Апреля 2012, 02:42 | Сообщение # 252
постоянный участник
Сейчас нет на сайте
Quote (Йакуд)
Aikidos, Нет, дело не в библиотеке, а в понимании что реально творится у тебя в коде.

Я знаю это, но, как ты успел заметить, что в студии 2008 всё работает нормально.


Ты вышел в поле. Ты куришь гашиш. Ты видишь машину. Ты медведь. Ты горишь.
ЙакудДата: Понедельник, 09 Апреля 2012, 02:46 | Сообщение # 253
участник
Сейчас нет на сайте
Aikidos, Ты уверен? Сам проверял? тут даже по логике должно работать в 10 и 08 100% одинаково. Библиотека тут совершенно не при чем. Может быть, господин Нохчи не понял сразу всей проблемы и просто запустил код, посмотрел что все работает без ошибок и выключил.. Не исключаем этот вариант.

"Хороший художник – копирует, гениальный – ворует!" — Pablo Picasso
.blanco 2.0
НохчиДата: Понедельник, 09 Апреля 2012, 02:47 | Сообщение # 254
заслуженный участник
Сейчас нет на сайте
Quote (Aikidos)
Я знаю это, но, как ты успел заметить, что в студии 2008 всё работает нормально

Нет. Похоже мы друг - друга не поняли просто. Я пошагово трассировал код, а ты поставил бряк в цикл и жал F5.
Quote (Aikidos)
После того, как он доходит до 5 и возвращает назад, то в следующий раз начинает не с первого элемента в массиве, а со второго

Я думал у тебя myMap.begin() возвращает итератор установленный на второй элемент.
Йакуд - молоток.


Многие вопросы по Windows отпадут, если посмотреть тут

Сообщение отредактировал Нохчи - Понедельник, 09 Апреля 2012, 02:49
AikidosДата: Понедельник, 09 Апреля 2012, 02:50 | Сообщение # 255
постоянный участник
Сейчас нет на сайте
Тогда всё понятно. Всем спасибо за разъяснение и помощь smile Вопрос закрыт smile

Ты вышел в поле. Ты куришь гашиш. Ты видишь машину. Ты медведь. Ты горишь.
ЙакудДата: Понедельник, 09 Апреля 2012, 02:50 | Сообщение # 256
участник
Сейчас нет на сайте
Aikidos, Вот в онлайн компиляторе скомпилировал. Вместо брейкпоинта, выводил текст. Все точно так же работает как я и говорил и никакая библиотека не виновата. happy

"Хороший художник – копирует, гениальный – ворует!" — Pablo Picasso
.blanco 2.0


Сообщение отредактировал Йакуд - Понедельник, 09 Апреля 2012, 02:51
AikidosДата: Понедельник, 09 Апреля 2012, 03:12 | Сообщение # 257
постоянный участник
Сейчас нет на сайте
Quote (Йакуд)
Все точно так же работает как я и говорил и никакая библиотека не виновата.

Quote (Aikidos)
Тогда всё понятно.


Это был последний пазл и мозайка стала выглядеть как нужно. Ещё раз всем спасибо.


Ты вышел в поле. Ты куришь гашиш. Ты видишь машину. Ты медведь. Ты горишь.
GavolotДата: Понедельник, 09 Апреля 2012, 03:45 | Сообщение # 258
Последователь Тени
Сейчас нет на сайте
Оказалось, что я даже толком не понял как вообще использовать функции доса для прерывания))) Это для меня пока темный лес, в который я не за что сейчас не пойду. Есть способы по проще избавления от моргания в моей супер игре на С++? Графика символьная. Просто гугл молчит на подобные запросы) Где только не пробовал лазить на подобную тему.

В общем что-то делаю, но пока не пойму ни как :)
Тень - выражение основной сущности человека.
ЙакудДата: Понедельник, 09 Апреля 2012, 04:07 | Сообщение # 259
участник
Сейчас нет на сайте
Gavolot, я так понимаю, ты обновляешь каждую итерацию целиком весь экран?? Этого делать не стоит! Обновляй только те области в которых произошли изменения. да, это может показаться трудным, но легких путей тут не много.. Ещё я видел специальные библиотеки для "рогаликов" на c++. Там были интересные функции. Как раз именно то, что тебе нужно! Покопай в ту сторону..

"Хороший художник – копирует, гениальный – ворует!" — Pablo Picasso
.blanco 2.0
GavolotДата: Понедельник, 09 Апреля 2012, 04:20 | Сообщение # 260
Последователь Тени
Сейчас нет на сайте
Йакуд, Я то думал я самый умный, даже и не думал, что библиотеки для создания рогаликов существуют))) Спасибо +.

Добавлено (09.04.2012, 04:20)
---------------------------------------------
Я конечно все понимаю, но для меня это действительно открытие))) Буду потом разбираться в этих библиотеках, ведь без них на базовых знаниях я не вытяну что-то подобное.


В общем что-то делаю, но пока не пойму ни как :)
Тень - выражение основной сущности человека.
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг