Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения - страница 20
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
1. Устранить неоднозначность поведения:
Если передать "INT_MAX - 10" в качества параметра в CPrimeGenerator::ExpandPrime, то вернется результат "INT_MAX".
Если передать "INT_MAX - 10" в качества параметра в CPrimeGenerator::GetPrime, то вернется тот же результат: "INT_MAX - 10".
Так же в обоих случаях возвращаемое значение не является простым числом, что вводит пользователя в заблуждение.
По первому пункту:
Здесь нет никакой неоднозначности.
Метод GetPrime должен возвращать ближайшее сверху простое число, но на промежутке от INT_MAX - 10 до INT_MAX таковых нет, поэтому и возвращается INT_MAX - 10.
Метод ExpandPrime с начало удваивает входное значение и уже от полученного числа вызывается метод GetPrime.
Плюс к этому в ExpandPrime стоит проверка на выход за пределы INT_MAX:
По моему логика поведения этих методов абсолютно однозначная и правильная.
Относительно второго и третьего пункта:
Предложенные вами изменения имеют отношения по большей части только к краевым задачам, когда размеры CHashMap очень большие. При этом нет никаких гарантий, что они будут иметь положительное влияние на производительность, поэтому нужно проводить отдельные исследования для определения корректности предложенных вами изменений.
Здесь нет никакой неоднозначности.
Метод GetPrime должен возвращать ближайшее сверху простое число, но на промежутке от INT_MAX - 10 до INT_MAX таковых нет, поэтому и возвращается INT_MAX - 10.
Метод ExpandPrime с начало удваивает входное значение и уже от полученного числа вызывается метод GetPrime.
Плюс к этому в ExpandPrime стоит проверка на выход за пределы INT_MAX:
По моему логика поведения этих методов абсолютно однозначная и правильная.
1. Функции могут вернуть не простые числа, а непонятно какое числа.
Как пользователь использует эти данные - это его проблемы, может он их в long кастит и дальше в супервычислительные функции передает, какая разница.
Факт заключается в том, что может возвращаться не то, что заявлено и ожидается по умолчанию от функций.
2. Как проверить, что в результате вызова функции вернулось простое число, а не что попало?
Просто сравнить с INT_MAX не получится.
Нужно сравнивать с последним доступным простым числом меньше INT_MAX.
Каждый раз сравнивать результат вызова этих функций с каким-то магическим числом, что бы убедиться что все работает верно - как по мне, это бред.
1. Функции могут вернуть не простые числа, а непонятно какое числа.
Как пользователь использует эти данные - это его проблемы, может он их в long кастит и дальше в супервычислительные функции передает, какая разница.
Факт заключается в том, что может возвращаться не то, что заявлено и ожидается по умолчанию от функций.
2. Как проверить, что в результате вызова функции вернулось простое число, а не что попало?
Просто сравнить с INT_MAX не получится.
Нужно сравнивать с последним доступным простым числом меньше INT_MAX.
Каждый раз сравнивать результат вызова этих функций с каким-то магическим числом, что бы убедиться что все работает верно - как по мне, это бред.
1. Ваш случай получения методом GetPrime не простого числа, пока что единственный, который я встречал. Данный инцидент будет исправлен путем изменения проверки при генерации простых чисел:
2. Для проверки числа на простоту реализован метод CPrimeGenerator::IsPrime
Попытался перейти со своего ArrayList на ваш, который в Generic/ArrayList.mqh
МЕ после "." ничего не выдаёт.
Как получить значение? Get() и [] отсутствуют в классе.
И не учитывается, что может быть массив указателей.
И кто эту библиотеку создает?
Вот мой вариант ArrayList из Java:
Для того что бы коллекции Generic работали корректно с объектами классов, эти классы должны реализовывать интерфейс IEqualityComparable, в котором определены методы Equals и HashCode. Т.е. пользователю самому необходимо задавать методы вычисления хэш кодов, и это пока единственный вариант, так как реализовать эти методы автоматически, как это сделано например в .Net, средствами MQL5 не получиться.
Тогда зачем ваш шаблон работает с любыми типами, вводя программиста в заблуждение? Если корректно работают только классы, наследуемые от IEqualityComparable, значит нужно запретить работу с другими типами на уровне компилятора.
Напомню, речь об этом коде:
Полагаю, эту функцию надо заменить на такую:
Тогда зачем ваш шаблон работает с любыми типами, вводя программиста в заблуждение? Если корректно работают только классы, наследуемые от IEqualityComparable, значит нужно запретить работу с другими типами на уровне компилятора.
С таким неудобно будет работать. По перегрузкам GetHashCode для стандартных типов виден интерфейс получения хэш-кода.
Напрягает отсутствие этого
Т.е. для объектов облом сейчас.
С таким неудобно будет работать. По перегрузкам GetHashCode для стандартных типов виден интерфейс получения хэш-кода.
А в чём удобство сейчас? То что передав в эту функцию enum или указатель класса, не поддерживающего интерфейс, получаешь просто имя класса? Шикарный хэш ) И главное, код работает, компилируется, как будто всё нормально. Это не дело.
А в чём удобство сейчас? То что передав в эту функцию enum или указатель класса, не поддерживающего интерфейс, получаешь просто имя класса? Шикарный хэш ) И главное, код работает, компилируется, как будто всё нормально. Это не дело.
Да, фигню они сделали. Бездумно скопипастели с NetFramework, хотя очевидно же что без поддержки интерфейсов на уровне языка, это не может работать адекватным образом. Помню уровень кодов от MQ 6-7 лет назад и сейча - по сравнению с тем временем сегодня мрак какой-то.
А в чём удобство сейчас? То что передав в эту функцию enum или указатель класса, не поддерживающего интерфейс, получаешь просто имя класса? Шикарный хэш ) И главное, код работает, компилируется, как будто всё нормально. Это не дело.
Согласен, лучше сразу получить ошибку компиляции, чем долго разбираться, почему же не работает.
Честно говоря, сходу и не видно, зачем там прилепили интерфейс. Ведь напрашивается просто перегрузка GetHashCode для нужного типа, а не начинать городить IEqualityComparable.