Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения - страница 29
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
В MSDN его называют именно кольцевой буфер, я же не придумал название.
ссылку в студию
...и заканчивая переделкой под аргументы по ссылке, а не только по значению.
могут быть проблемы с литералами
ссылку в студию
могут быть проблемы с литералами
Лень снова искать ту статью, но я немного натянул. Кольцевой одно или двух-связанный лист строится на базе linked list, но в последнем элементе хранится ссылка на самый первый.
могут быть проблемы с литералами
Кольцевой одно или двух-связанный лист строится на базе linked list, но в последнем элементе хранится ссылка на самый первый.
Скорее всего, тот кто портировал эти классы, решил просто облегчить себе жизнь, упростив код. Вместо двух указателей m_first и m_last сделал один указатель m_head…
Посмотрел исходники dotnet, и понял причину. Сам класс LinkedList портирован верно, там действительно только один указатель head, являющийся одновременно и началом, и концом. Т.е. внутренняя реализация действительно является зацикленной. А вот внешнее поведение - нет. У MQ ошибка в классе CLinkedNode (методы Next и Previous). Вот как выглядит их оригинальная реализация:
А вот как портировано в MQL:
Возможно по невнимательности перепутали.
Но вообще я также немного удивлён насчёт реализации в dotnet. Почему было не сделать два указателя в самом списке (first и last) вместо одного head. Это позволило бы избежать лишних проверок в вышеперечисленных методах узла списка, т.е. они бы выглядели в точности как сейчас у MQ, но при этом всё бы работало правильно. Это конечно чуть замедлит процесс вставки/удаления узлов, но зато значительно ускорит итерацию по ним, что гораздо приоритетней. Next и Previous вызываются несомненно чаще, чем добавляются узлы. Я именно так себе и сделал, думал что и у мелкомягких будет аналогично. Ну да ладно )
Кстати, у MQ ещё один косяк в реализации CLinkedListNode и CRedBlackTreeNode. Их поля m_next, m_prev и др. (кроме m_value) предназначены для изменения исключительно самим классом списка. Никто другой не должен менять их. Поэтому в dotnet они являются internal полями. Пользователю доступны лишь get-методы. А MQ зачем-то сделали публичные методы для изменения этих полей, причём ладно бы хоть назвали бы их как-нибудь специфично... но нет же, обычные названия:
Всем привет!
В CHashMap есть другой способ удалить элементы, кроме как скопировать их через CopyTo и вручную поудалять?
Вот ещё пару дровишек в топку кривой реализации библиотеки. Класс CKeyValuePair у них зачем-то наследует интерфейс IComparable (а соответственно и IEqualityComparable), требуя в свою очередь чтобы и пользовательский тип Key тоже поддерживал эти интерфейсы. Хотя в этом нет никакой надобности, если мы задаём собственный Comparer. В оригинале естественно у KeyValuePair нет никаких интерфейсов.
Продолжив копаться в этом, обнаруживашь ещё более странные вещи:
Т.е. случайно передав в конструктор битый указатель, программа не только продолжить спокойно работать, но ещё и логика изменится! Да уж...
А должен конструктор выглядеть вот так:
И никаких POINTER_INVALID . А для дефолтного компарера есть другая сигнатура конструктора.
Подскажите, почему не компилируется код?
Проблема в системных перечислениях: ENUM_CHART_PROPERTY_DOUBLE, ENUM_CHART_PROPERTY_STRING что-то с ними не так. Если в качестве типа ключа использовать свой enum, то компиляция тоже проходит.