12.04.2010, 11:14 | #1 |
Участник
|
Крэш системы при использовании не актуального MapEnumerator
X++: static void JobUpdateMapTest(Args _args) { Map Map = new Map(Types::Integer, Types::Container); MapEnumerator m; str str31_34 = "1234567890" + "1234567890" + "1234567890" + "1234"; // 31 <= length <= 34 int key = 1; ; Map.insert(key, ["1"]); m = Map.getEnumerator(); m.moveNext(); // получаем энумератор // меняем содержимое мапа Map.remove(key); Map.insert(key, [str31_34]); // пытаемся двигаться дальше m.moveNext(); // crash } Вопрос к общественности: 1) Правомерно ли, заранее полученный MapEnumerator, использовать после изменения самого мапа? Только если производилось удаление элементов? Только если производилось добавление? Всегда правомерно/не правомерно? 2) А как вы реализуете массовое обновление значений, хранящихся в мапе? P.S.: Забыл указать. Ошибка у меня воспроизводится в версии AX4.0. В Ax2009 ошибки нет. Значит ли это, что такой код писать можно? Последний раз редактировалось S.Kuskov; 12.04.2010 в 11:22. |
|
12.04.2010, 15:11 | #2 |
Участник
|
А удалять-то зачем? Map, вообще-то, не допускает появления дубля ключа, но при этом и вставку не запрещает. Таким образом, вставка в Map того же самго значения ключа фактически означает замену содержимого. Т.е. команда
Map.remove(key); просто лишняя. Ее безболезненно можно удалить. X++: Map.insert(key, ["1"]); print map.lookup(key); Map.insert(key, ["2"]); print map.lookup(key); pause; Последний раз редактировалось Владимир Максимов; 12.04.2010 в 15:13. |
|
|
За это сообщение автора поблагодарили: S.Kuskov (3). |
12.04.2010, 15:24 | #3 |
Участник
|
|
|
12.04.2010, 15:40 | #4 |
Участник
|
Можно вместо enumerator пользоваться iterator и его методами изменения, например \System Documentation\Classes\MapIterator\delete
|
|
|
За это сообщение автора поблагодарили: S.Kuskov (2). |
Теги |
баг, как правильно |
|
|