![]() |
|
Модераторы: bsa |
![]()
|
|
| BorisMQL4 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 25.9.2009 Репутация: нет Всего: нет |
Всем привет!
Только начал изучать С++ написал DLL для обращения к ней из торговой платформы МТ4. В принципе все что было запланировано, работает отлично. Но иногда появляется сообщение (скрин прилагаю), и возникает ошибка ( терминал вылетает с ошибкой ). Кратко опишу функционал DLL. Из DLL импортируются 4 функции, все функции получают входные данные строкового (char) и целочисленного типа (int). Возвращают эти функции целое число (int). В функции выполняются простые строковые и числовые операции. Из строки извлекается подстрока. Пример: пришло "123;500;str", из этой строки извлекаются подстроки с последующем переводом в формат (int), то есть извлекаем из строки числа, 123 и 500, остаток "str" не используется, и сохраняем в переменные для дальнейшего использования. Так работают все 4 функции. Вопрос: Что это за сообщение и с чем может быть связано? Спасибо! Присоединённый файл ( Кол-во скачиваний: 9 )
1.jpg 58,47 Kb |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
это сообщение возникает при срабатывании макроса assert (используется для проверки валидности данных, которые могут быть невалидными только в случае программной ошибки). В сообщении указывается место, где находится assert и условие, при котором он не должен срабатывать.
В твоем случае assert находится в strtol.c, логично предположить, что ты используешь функцию strtol. Эта функция имеет такое объявление:
|
|||
|
||||
| BorisMQL4 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 25.9.2009 Репутация: нет Всего: нет |
Спасибо за быстрый ответ.
Я в коде использую функцию atoi. вот отрывок кода отвечающего за извлечение из строки целого числа:
где text - строка вида "135;str" Примечание: строка может быть пуста.. то есть может быть получено пустое значение строки. Судя по тому что Вы приводили в сообщении выше, все дело в том что при получении пустого значения вместо строки, в функцию atoi подается NULL, и возникает эта ошибка. Я правильно все понял? Если я в чем то ошибаюсь поправьте меня. Предполагаю что решением этой проблемы будет проверка текстовой переменной int_str1 на отсутствие значение то есть код будет выглядеть приблизительно так:
Правильно ли теперь составлен код? Спасибо! |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
BorisMQL4, да, так уже правильней. только не забудь проинициализировать value1 в случае нулевой строки.
|
|||
|
||||
| BorisMQL4 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 25.9.2009 Репутация: нет Всего: нет |
Большое тебе, человеческое спасибо за помощь!
Написал отдельный скрипт на MQL4 из него вызывал по очереди функции из DLL, специально генерировал ошибки (отправлял пустую строку), все подтвердилось, выяснил все участки кода где была возможна такая проблема в режиме нормальной работы. Специфика всей системы (связки советник на MQL4 + DLL) такая что пустое значение передавалось всегда во время самого первого обращения к DLL, связано это было с тем что к моменту первого обращения не был заполнен файл обмена (используется программой MQL4 для обмена данными с другим модулем). В первый запуск DLL считывала из этого файла данные в ожидании ответа (то есть DLL должна прочитать из файла строку и извлечь из нее целое число). Этот файл периодически отчищается но бывает это очень редко по этому и ошибка возникала очень редко, но я не мог понять из за чего она возникает. Теперь я разобрался, все отладил, модифицировал код так чтобы функция atoi() не вызывалась если строка = NULL. Все проверил, теперь работает все отлично. У меня есть еще один вопрос: DLL я пишу в Visual C++ 2008, из DLL производятся вызовы функций из системной библиотеки "kernel32.dll". Под Windows Vista DLL будет работать корректно, если терминал будет запускаться в режиме совместимости с XP ? Раньше я напрямую обращался из программы MQL4 в "kernel32.dll" , без использования внешней DLL. Под Windows Vista удавалось запускать программу только в режиме совместимости с XP, без этого режима терминал вылетал с ошибкой. Спасибо! |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Про kernel32.dll тебе в другой раздел (WinAPI). |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |