Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по импорту функций из DLL, Проблемы с импортом функций из DLL 
:(
    Опции темы
BorisMQL4
  Дата 25.9.2009, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
bsa
Дата 25.9.2009, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



это сообщение возникает при срабатывании макроса assert (используется для проверки валидности данных, которые могут быть невалидными только в случае программной ошибки). В сообщении указывается место, где находится assert и условие, при котором он не должен срабатывать.
В твоем случае assert находится в strtol.c, логично предположить, что ты используешь функцию strtol. Эта функция имеет такое объявление:
Код
long int strtol(const char *nptr, char **endptr, int base);
Она получает строку по указателю nptr. Требование, чтобы nptr был не равен NULL. Вот у тебя в сообщение и написано: "Assertion Failed, Expression: nptr != NULL".
PM   Вверх
BorisMQL4
  Дата 25.9.2009, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 25.9.2009

Репутация: нет
Всего: нет



Спасибо за быстрый ответ.

Я в коде использую функцию atoi.

вот отрывок кода отвечающего за извлечение из строки целого числа:

Код

int_str1 = strtok_s(text, ";", &next_token);
value1 = atoi(int_str1);
return(value1);



где 

      text - строка вида "135;str"

Примечание: строка может быть пуста.. то есть может быть получено пустое значение строки.
Судя по тому что Вы приводили в сообщении выше, все дело в том что при получении пустого значения вместо строки, в функцию atoi подается NULL, и возникает эта ошибка.

Я правильно все понял? Если я в чем то ошибаюсь поправьте меня.

Предполагаю что решением этой проблемы будет проверка текстовой переменной int_str1 на отсутствие значение то есть код будет выглядеть приблизительно так:

Код

int_str1 = strtok_s(text, ";", &next_token);
if(int_str1 != NULL) value1 = atoi(int_str1);
return(value1);


Правильно ли теперь составлен код?

Спасибо!
PM MAIL   Вверх
bsa
Дата 25.9.2009, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



BorisMQL4, да, так уже правильней. только не забудь проинициализировать value1 в случае нулевой строки.
PM   Вверх
BorisMQL4
  Дата 25.9.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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, без этого режима терминал вылетал с ошибкой.

Спасибо!
PM MAIL   Вверх
bsa
Дата 25.9.2009, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196




M
bsa
Пожалуйста, один топик - один вопрос.

Про kernel32.dll тебе в другой раздел (WinAPI).
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0464 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.