Все строки я вывожу или на график в коммент, или в принт терминала, когда строка поступает её сразу видно, в комменте видно кривая она или нет. Когда идут большие временные пропуски, то строка на графике редко появляется, а в принте дыры. Сомнение что не поступает строка из сокета отпадает, тиковые данные поступают с частотой в миллисекунды. Из сокета getData() приняли в переменную указатель, из переменной указателя сразу копирую в mql, не каких обёрток. Да задекларирована по феншую ))
В общем по любому траблы с mql-овским string. Испробовано уже и проверено много вариантов. Строка из сокета идёт с терминальным нулём, и самая достоверная проверочная функция показывает проблему именно на mql
В общем поюзаю пока с sizeof(wichar_t*) посмотрю на поведение. Но наверно чтобы обезопаситься от изменений от MQ, наверно действительно напишу строки на массивах.
Запись в файл - имел в виду на стороне dll, если в файл пишется, а в мкл не попадает, то это уже весомые аргументы с заявлением о баге, может попаравят.
А обёртка есть без вашего желания, MQ скрывают код/адреса от внешнего мира, всё идет не напрямую.
Запись в файл - имел в виду на стороне dll, если в файл пишется, а в мкл не попадает, то это уже весомые аргументы с заявлением о баге, может поправят.
А обёртка есть без вашего желания, MQ скрывают код/адреса от внешнего мира, всё идет не напрямую.
Записал получаемые строки в файл. Так как сокетная функция возвращает указатель на строку, то в файл пишется указатель на строку, и потом этот указатель копируется в mql. С помощью функции
wcscpy(out, data);
Длина получаемой строки 164, в mql выделено 200
StringInit(out, 200, 32);
Скопированная строка полученная в mql получается ровная по длине, но идут жёсткие пропуски в копировании. В скрипте mql цикл while крутится с Sleep(1)
Правильно, я выделяю буфер под строку out, и инициализирую её пробелами. Далее передаю эту строку(указатель) в dll.
В dll в out копируются wchar_t* данные, то есть тоже указатель. По логике проблем не должно возникать. Как я понимаю согласно справке, функция StringInit и должна задавать длину строки. Но тут ещё с самой функцией StringInit непонятки, указывал длину строки, фигня лезла, указал размер указателя, всё заработало. Не пойму о какой ручной передаче длины строки вы имели ввиду.
И если использовать sizeof(wchar_t) без указателя, то строка начинает плыть лишними символами, что вызывает проблему с парсингом и утечкой. Для передачи строк в dll использовался пример Рената, из его статьи как писать dll. Но вот почему то именно если передаю без указателя sizeof(wchar_t), то строка плывёт, а с указателем sizeof(wchar_t*) проблем нет. Имне кажется логично, я же копирую строку как указатель, то и размер нужно передавать указателя, а не типа.
Иногда делаешь правильно - не работает.
Делаешь неправильно - кажется, что работает.
В таких случаях надо делать правильно и искать ошибку в другом месте.
Записал получаемые строки в файл. Так как сокетная функция возвращает указатель на строку, то в файл пишется указатель на строку, и потом этот указатель копируется в mql. С помощью функции
Длина получаемой строки 164, в mql выделено 200
Скопированная строка полученная в mql получается ровная по длине, но идут жёсткие пропуски в копировании. В скрипте mql цикл while крутится с Sleep(1)
1. В MQL копируется не указатель, а строка.
2. Вы в MQL выделили строку в 200 символов. Потом скопировали в неё 164 символа. После этого, посмотрите размер строки в MQL. Он остался 200.
2. Вы в MQL выделили строку в 200 символов. Потом скопировали в неё 164 символа. После этого, посмотрите размер строки в MQL. Он остался 200.
Длина а не размер! Длина в символах, размер в байтах. Проверил, после получения строки из 164 символов, да длина так же осталась 200. Какие мысли по этому поводу?
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Все строки я вывожу или на график в коммент, или в принт терминала, когда строка поступает её сразу видно, в комменте видно кривая она или нет.
В общем по любому траблы с mql-овским string. Испробовано уже и проверено много вариантов.Когда идут большие временные пропуски, то строка на графике редко появляется, а в принте дыры.
Сомнение что не поступает строка из сокета отпадает, тиковые данные поступают с частотой в миллисекунды.
Из сокета getData() приняли в переменную указатель, из переменной указателя сразу копирую в mql, не каких обёрток.
Да задекларирована по феншую ))
Строка из сокета идёт с терминальным нулём, и самая достоверная проверочная функция
показывает проблему именно на mql
В общем поюзаю пока с sizeof(wichar_t*) посмотрю на поведение.
Но наверно чтобы обезопаситься от изменений от MQ, наверно действительно напишу строки на массивах.
Запись в файл - имел в виду на стороне dll, если в файл пишется, а в мкл не попадает, то это уже весомые аргументы с заявлением о баге, может попаравят.
А обёртка есть без вашего желания, MQ скрывают код/адреса от внешнего мира, всё идет не напрямую.
Запись в файл - имел в виду на стороне dll, если в файл пишется, а в мкл не попадает, то это уже весомые аргументы с заявлением о баге, может поправят.
А обёртка есть без вашего желания, MQ скрывают код/адреса от внешнего мира, всё идет не напрямую.
Записал получаемые строки в файл.
Так как сокетная функция возвращает указатель на строку, то в файл пишется указатель на строку, и потом этот указатель копируется в mql.
С помощью функции
Длина получаемой строки 164, в mql выделено 200
Скопированная строка полученная в mql получается ровная по длине, но идут жёсткие пропуски в копировании.
В скрипте mql цикл while крутится с Sleep(1)
Тогда пропусков нет, но скопированные строки получаются не ровные, в конце строки появляются лишние символы.
Добавление wcslen(data)+1 не помогает.
Итог, из всех страниц которые я тут пишу.
mql-овский string не корректно принимает из dll, скопированный указатель на строку const wchar_t*
Правильно, я выделяю буфер под строку out, и инициализирую её пробелами.
Далее передаю эту строку(указатель) в dll.
В dll в out копируются wchar_t* данные, то есть тоже указатель. По логике проблем не должно возникать.
Как я понимаю согласно справке, функция StringInit и должна задавать длину строки.
Но тут ещё с самой функцией StringInit непонятки, указывал длину строки, фигня лезла, указал размер указателя, всё заработало.
Не пойму о какой ручной передаче длины строки вы имели ввиду.
И если использовать sizeof(wchar_t) без указателя, то строка начинает плыть лишними символами, что вызывает проблему с парсингом и утечкой.
Для передачи строк в dll использовался пример Рената, из его статьи как писать dll.
Но вот почему то именно если передаю без указателя sizeof(wchar_t), то строка плывёт, а с указателем sizeof(wchar_t*) проблем нет.
Имне кажется логично, я же копирую строку как указатель, то и размер нужно передавать указателя, а не типа.
Иногда делаешь правильно - не работает.
Делаешь неправильно - кажется, что работает.
В таких случаях надо делать правильно и искать ошибку в другом месте.
Записал получаемые строки в файл.
Так как сокетная функция возвращает указатель на строку, то в файл пишется указатель на строку, и потом этот указатель копируется в mql.
С помощью функции
Длина получаемой строки 164, в mql выделено 200
Скопированная строка полученная в mql получается ровная по длине, но идут жёсткие пропуски в копировании.
В скрипте mql цикл while крутится с Sleep(1)
1. В MQL копируется не указатель, а строка.
2. Вы в MQL выделили строку в 200 символов. Потом скопировали в неё 164 символа. После этого, посмотрите размер строки в MQL. Он остался 200.
Иногда делаешь правильно - не работает.
Делаешь неправильно - кажется, что работает.
В таких случаях надо делать правильно и искать ошибку в другом месте.
По этому чтобы было правильно, я отказался от memcpy, и использовал wcscpy или wcsncpy.
Результат, постом выше.
1. В MQL копируется не указатель, а строка.
Раздел 3.3
2. Вы в MQL выделили строку в 200 символов. Потом скопировали в неё 164 символа. После этого, посмотрите размер строки в MQL. Он остался 200.
Длина а не размер! Длина в символах, размер в байтах.
Проверил, после получения строки из 164 символов, да длина так же осталась 200.
Какие мысли по этому поводу?
По этому чтобы было правильно, я отказался от memcpy, и использовал wcscpy или wcsncpy.
Результат, постом выше.
Я имел ввиду sizeof( wchar_t* ).
Раздел 3.3
Вам бы лучше со мной не спорить, а прочитать повнимательней эту статью. И разобраться, что там происходит.
Тогда и проблем не будет.
То что Вы хотите сделать, на самом деле не так сложно.