Если не сработало, значит на вход подавалась пустая строка. Вариант мой правильный и рабочий, ваш нет.
Вы тупо перезаписывайте буфер с большим запасом, естественно, что захватывается и нужная строка.
Ну как пустая строка? Когда строка из сокета поступает, в других вариантах хоть и кривая, но она не пустая. Я не говорю что ваш вариант не правильный, но в вашем варианте вы используете массив строки. В моём случае это указатель
const wchar_t* data = getData();
Сокетная функция возвращает указатель на const wchar_t* По этому я и грешу на mql баг, потому что уже какие только сишные функции не пробовал, хардкоры с +1 или +2 применял. Не идёт и всё.
То строка копируется очень редко, и с большими пропусками по времени. Этот вариант уже пробовался в самом начале, полистайте пару страниц назад, там я скрины выкладывал.
Понимаете, даже вот эта функция wcscpy(out, data); которая автоматически считает длину строки, вызывает такое же поведение, временной пропуск всей строки.
Ну как пустая строка? Когда строка из сокета поступает, в других вариантах хоть и кривая, но она не пустая. Я не говорю что ваш вариант не правильный, но в вашем варианте вы используете массив строки. В моём случае это указатель
Сокетная функция возвращает указатель на const wchar_t* По этому я и грешу на mql баг, потому что уже какие только сишные функции не пробовал, хардкоры с +1 или +2 применял. Не идёт и всё.
Пишите строки после memcpy() параллельно в файл, если мкл виноват (там ведь какая-то обёртка поверх вызовов с копированием аргументов), то файл не пустой будет, наверное.
ЗЫ: ну так, на всякий случай - в мкл библиотечная функция задекларирована ведь с сылкой ? void fn(string &s)?
Пишите строки после memcpy() параллельно в файл, если мкл виноват (там ведь какая-то обёртка поверх вызовов с копированием аргументов), то файл не пустой будет, наверное.
ЗЫ: ну так, на всякий случай - в мкл библиотечная функция задекларирована ведь с сылкой ? void fn(string &s)?
Все строки я вывожу или на график в коммент, или в принт терминала, когда строка поступает её сразу видно, в комменте видно кривая она или нет. Когда идут большие временные пропуски, то строка на графике редко появляется, а в принте дыры. Сомнение что не поступает строка из сокета отпадает, тиковые данные поступают с частотой в миллисекунды. Из сокета getData() приняли в переменную указатель, из переменной указателя сразу копирую в mql, не каких обёрток. Да задекларирована по феншую ))
В общем по любому траблы с mql-овским string. Испробовано уже и проверено много вариантов. Строка из сокета идёт с терминальным нулём, и самая достоверная проверочная функция
wcscpy(out, data);
или
wcsncpy(out, data, wcslen(data)); //wcslen(data)+1
показывает проблему именно на mql
В общем поюзаю пока с sizeof(wichar_t*) посмотрю на поведение. Но наверно чтобы обезопаситься от изменений от MQ, наверно действительно напишу строки на массивах.
Но наверно чтобы обезопаситься от изменений от MQ, наверно действительно напишу строки на массивах.
Золотые слова. Оно конечно хочется string использовать, но в виду отсутствия стандарта с описанием его реализации и/или поведения при передачи в dll, это чистой воды ub получается. А так, string в short[] и спокойно передаешь массив, единственное, что накладные расходы на создание и копирование массива.
PS. Все-таки, сдается мне, что проблема не в mql, а у Вас в либе. У меня все тесты нормально прошли, да и не чему там по логике глючить, string достаточно тривиальная обертка над wchar_t*, а скорее всего над wstring, что бы там напортачить.
Золотые слова. Оно конечно хочется string использовать, но в виду отсутствия стандарта с описанием его реализации и/или поведения при передачи в dll, это чистой воды ub получается. А так, string в short[] и спокойно передаешь массив, единственное, что накладные расходы на создание и копирование массива.
PS. Все-таки, сдается мне, что проблема не в mql, а у Вас в либе. У меня все тесты нормально прошли, да и не чему там по логике глючить, string достаточно тривиальная обертка над wchar_t*, а скорее всего над wstring, что бы там напортачить.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Нет, так не сработало, строка не передается, но и проблем не возникает.
А вот так без нуля сработало, но так плывёт конец строки лишними символами.
Если не сработало, значит на вход подавалась пустая строка. Вариант мой правильный и рабочий, ваш нет.
Вы тупо перезаписывайте буфер с большим запасом, естественно, что захватывается и нужная строка.
PS. Это С, это хардкор, тут форумы курить не стоит, только серьезные издания и доки, только свои мозги.
Этот хардкор (wcslen(data)+1) я уже пробовал, и сейчас попробовал ваш вариант, строка не копируется вообще.
Этот хардкор (wcslen(data)+1) я уже пробовал, и сейчас попробовал ваш вариант, строка не копируется вообще.
А что означает второй параметр в функции memspy_s?
А что означает второй параметр в функции memspy_s?
- длина строки out., только +1 символ, который /000 забыли.
Если не сработало, значит на вход подавалась пустая строка. Вариант мой правильный и рабочий, ваш нет.
Вы тупо перезаписывайте буфер с большим запасом, естественно, что захватывается и нужная строка.
Ну как пустая строка? Когда строка из сокета поступает, в других вариантах хоть и кривая, но она не пустая.
Я не говорю что ваш вариант не правильный, но в вашем варианте вы используете массив строки.
В моём случае это указатель
const wchar_t* data = getData();Сокетная функция возвращает указатель на const wchar_t*
По этому я и грешу на mql баг, потому что уже какие только сишные функции не пробовал, хардкоры с +1 или +2 применял.
Не идёт и всё.
Попробую угадать
- длина строки out., только +1 символ, который /000 забыли.
Если вы имеете ввиду об этом
То строка копируется очень редко, и с большими пропусками по времени.
Этот вариант уже пробовался в самом начале, полистайте пару страниц назад, там я скрины выкладывал.
Вот, такое же поведение как на втором скрине, модеры зачем то имена файлов на кракозябры заменили.
Понимаете, даже вот эта функция wcscpy(out, data); которая автоматически считает длину строки, вызывает такое же поведение, временной пропуск всей строки.
Ну как пустая строка? Когда строка из сокета поступает, в других вариантах хоть и кривая, но она не пустая.
Я не говорю что ваш вариант не правильный, но в вашем варианте вы используете массив строки.
В моём случае это указатель
Сокетная функция возвращает указатель на const wchar_t*
По этому я и грешу на mql баг, потому что уже какие только сишные функции не пробовал, хардкоры с +1 или +2 применял.
Не идёт и всё.
Пишите строки после memcpy() параллельно в файл, если мкл виноват (там ведь какая-то обёртка поверх вызовов с копированием аргументов), то файл не пустой будет, наверное.
ЗЫ: ну так, на всякий случай - в мкл библиотечная функция задекларирована ведь с сылкой ? void fn(string &s)?Пишите строки после memcpy() параллельно в файл, если мкл виноват (там ведь какая-то обёртка поверх вызовов с копированием аргументов), то файл не пустой будет, наверное.
ЗЫ: ну так, на всякий случай - в мкл библиотечная функция задекларирована ведь с сылкой ? void fn(string &s)?Все строки я вывожу или на график в коммент, или в принт терминала, когда строка поступает её сразу видно, в комменте видно кривая она или нет.
В общем по любому траблы с mql-овским string. Испробовано уже и проверено много вариантов.Когда идут большие временные пропуски, то строка на графике редко появляется, а в принте дыры.
Сомнение что не поступает строка из сокета отпадает, тиковые данные поступают с частотой в миллисекунды.
Из сокета getData() приняли в переменную указатель, из переменной указателя сразу копирую в mql, не каких обёрток.
Да задекларирована по феншую ))
Строка из сокета идёт с терминальным нулём, и самая достоверная проверочная функция
показывает проблему именно на mql
В общем поюзаю пока с sizeof(wichar_t*) посмотрю на поведение.
Но наверно чтобы обезопаситься от изменений от MQ, наверно действительно напишу строки на массивах.
Золотые слова. Оно конечно хочется string использовать, но в виду отсутствия стандарта с описанием его реализации и/или поведения при передачи в dll, это чистой воды ub получается. А так, string в short[] и спокойно передаешь массив, единственное, что накладные расходы на создание и копирование массива.
PS. Все-таки, сдается мне, что проблема не в mql, а у Вас в либе. У меня все тесты нормально прошли, да и не чему там по логике глючить, string достаточно тривиальная обертка над wchar_t*, а скорее всего над wstring, что бы там напортачить.
Золотые слова. Оно конечно хочется string использовать, но в виду отсутствия стандарта с описанием его реализации и/или поведения при передачи в dll, это чистой воды ub получается. А так, string в short[] и спокойно передаешь массив, единственное, что накладные расходы на создание и копирование массива.
PS. Все-таки, сдается мне, что проблема не в mql, а у Вас в либе. У меня все тесты нормально прошли, да и не чему там по логике глючить, string достаточно тривиальная обертка над wchar_t*, а скорее всего над wstring, что бы там напортачить.
У меня тоже были сомнения на либу, не чего не исключаю из возможных причин.
Но конвертировал получаемую строку из сокета в ASCII коды, видно что строка корректная.
Дальше идёт простое копирование,
mql не принимает корректно указатель на строку.