Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
ssAprillss
0 / 0 / 0
Регистрация: 08.04.2014
Сообщений: 7
#1

Map/set iterator not dereferencable

11.04.2014, 19:08. Просмотров 1193. Ответов 5
Метки нет (Все метки)

Есть два класса, первый:

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
32
33
class AnimationManager
{
    public:
        String currentAim;
        std::map<String, Animation> animList;
    
 
        AnimationManager()
        {};
        
            void create(String name, Texture &t, int x, int y, int w, int h, int count, float Speed, int step)
            {
                
                animList.emplace(name, Animation(t,x,y,w,h,count,Speed,step));
                currentAim=name;
                    
 
            };
 
 
 
            void draw (RenderWindow &window, int x=0, int y=0)
            {
                 animList.find(currentAim)->second.sprite.setPosition(x,y);
                window.draw( animList.find(currentAim)->second.sprite);
            }
 
            void set(String name) {currentAim = name;}
            void flip (bool b) {animList.find(currentAim)->second.flip = b;}
            void tick (float time) {animList.find(currentAim)->second.tick(time);}
            void pause () {animList.find(currentAim)->second.isPlaying=false;}
            void play () {animList.find(currentAim)->second.isPlaying=true;}
};

И второй, в котором есть следующая функция:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 void update(float time)
 { 
  
  if (STATE==stay) anim.set("stay");
  if (STATE==walk) anim.set("walk");
  if (STATE==jump) anim.set("jump");
  if (STATE==duck) anim.set("duck");
 [B] if (STATE==climb) {anim.set("climb"); anim.pause(); if (dy!=0) anim.play(); if (!onLadder) STATE=stay;} [/B]
  if (shoot) { anim.set("shoot"); 
  if (STATE==walk) anim.set("shootandwalk");}
[B]  if (dir) anim.flip(dir);[/B]
  
  
  x += dx * time; 
  
  dy+=0.0005*time;
  
  y += dy*time;  
 
 [B] anim.tick(time);[/B]

Если я убираю строчки, выделенные жирным шрифтом, то ошибка пропадает, если же оставляю, то выводится следующие сообщение:map/set iterator not dereferencable. Возможно, я недопонимаю как работают итераторы. Как мне быть?

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2014, 19:08
Ответы с готовыми решениями:

Map/set!( iterator not dereferencable)
Есть функция,в которой происходит поиск в map по ключу. Если по данному ключу...

Map/set iterator not dereferencable
Всем доброго времени суток. Суть задания в том, чтобы удалить повторы...

map/set iterator not dereferencable
map&lt;string,int&gt; optimized(map&lt;string,int&gt;&amp;dict){ map&lt;string,int&gt;::iterator...

Ошибка Expression: map/set iterator not dereferencable
Здравствуйте! Мне нужно вывести контейнер map в обратном порядке. Делаю...

List iterator not dereferencable
Добрый день. Вот в таком маленьком коде возникает ошибка &quot;list iterator not...

5
DrOffset
7586 / 4555 / 1103
Регистрация: 30.01.2014
Сообщений: 7,416
11.04.2014, 20:03 #2
ssAprillss, это сообщение, я так понимаю, в рантайме уже выдается?
Тут суть в том, что std::map возвращает итератор end() в случае, если элемент не найден. А этот итератор нельзя разыменовывать.
0
ssAprillss
0 / 0 / 0
Регистрация: 08.04.2014
Сообщений: 7
11.04.2014, 20:09  [ТС] #3
Да, уже в ран тайме, а как это решить?
0
DrOffset
7586 / 4555 / 1103
Регистрация: 30.01.2014
Сообщений: 7,416
11.04.2014, 20:12 #4
ssAprillss, код писать корректный, студия эту проверку сделала и вывела сообщение. Но вообще не обязана была и программа бы просто упала.
Короче результат find() нужно сравнивать с end() и если только он не равен end() его можно разыменовывать.
0
ssAprillss
0 / 0 / 0
Регистрация: 08.04.2014
Сообщений: 7
11.04.2014, 20:47  [ТС] #5
Ну, я попробую, но я так и не понял, в чем моя ошибка была.
0
DrOffset
7586 / 4555 / 1103
Регистрация: 30.01.2014
Сообщений: 7,416
11.04.2014, 21:22 #6
ssAprillss, взгляни на пример.
В документации написано, что find возвращает end(), если элемент не найден. Это признак того, что он не найден. В чем смысл разыменования end(), если он никуда не указывает? В контейнерах стандартной библиотеки, это условное обозначение итератора следующего за последним элементом, и служит он только для обозначения конца последовательности или конца другой структуры (в случае map - это дерево). Он не предназначен для разыменования, а только лишь для сравнения с другими итераторами.
0
11.04.2014, 21:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2014, 21:22

deque iterator not dereferencable
итак программа должна считывать из файла данные об автобусных маршрутах (имя...

Ошибка list iterator not dereferencable
Ошибка при использовании итератора. Хэлп, сос :cry: void...

Ошибка "iterator not dereferencable" при использовании ссылки
Всем привет. Без ссылки все работает, с ссылкой ошибка: &quot;iterator not...


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

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

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