Форум программистов, компьютерный форум CyberForum.ru

Map/set iterator not dereferencable - C++

Восстановить пароль Регистрация
 
ssAprillss
0 / 0 / 0
Регистрация: 08.04.2014
Сообщений: 7
11.04.2014, 19:08     Map/set iterator not dereferencable #1
Есть два класса, первый:

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. Возможно, я недопонимаю как работают итераторы. Как мне быть?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
11.04.2014, 20:03     Map/set iterator not dereferencable #2
ssAprillss, это сообщение, я так понимаю, в рантайме уже выдается?
Тут суть в том, что std::map возвращает итератор end() в случае, если элемент не найден. А этот итератор нельзя разыменовывать.
ssAprillss
0 / 0 / 0
Регистрация: 08.04.2014
Сообщений: 7
11.04.2014, 20:09  [ТС]     Map/set iterator not dereferencable #3
Да, уже в ран тайме, а как это решить?
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
11.04.2014, 20:12     Map/set iterator not dereferencable #4
ssAprillss, код писать корректный, студия эту проверку сделала и вывела сообщение. Но вообще не обязана была и программа бы просто упала.
Короче результат find() нужно сравнивать с end() и если только он не равен end() его можно разыменовывать.
ssAprillss
0 / 0 / 0
Регистрация: 08.04.2014
Сообщений: 7
11.04.2014, 20:47  [ТС]     Map/set iterator not dereferencable #5
Ну, я попробую, но я так и не понял, в чем моя ошибка была.
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
11.04.2014, 21:22     Map/set iterator not dereferencable #6
ssAprillss, взгляни на пример.
В документации написано, что find возвращает end(), если элемент не найден. Это признак того, что он не найден. В чем смысл разыменования end(), если он никуда не указывает? В контейнерах стандартной библиотеки, это условное обозначение итератора следующего за последним элементом, и служит он только для обозначения конца последовательности или конца другой структуры (в случае map - это дерево). Он не предназначен для разыменования, а только лишь для сравнения с другими итераторами.
Yandex
Объявления
11.04.2014, 21:22     Map/set iterator not dereferencable
Ответ Создать тему
Опции темы

Текущее время: 03:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru