Показать сообщение отдельно
Старый 12.04.2010, 11:14   #1  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,444 / 1781 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Крэш системы при использовании не актуального 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.