Ошибки, баги, вопросы - страница 2577
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Согласен
Да тоже согласен. Но не всегда строку как массив удобно использовать, особенно когда эту строку нужно передавать через несколько функций.
Указатели в этом случае удобней, не нужно в каждой транзитной функции, перезаполнять этот массив, и дополнительно вводить ещё один параметр для массива, его размер.
Таким образом вы просто выделили буфер заведомо избыточного размера (отодвинули границу) и ошибка просто не проявляется - потому что она возникала именно на границе
Я тоже так думал, у строки длина 164, ставил 165, ставил 330.
330 это уже явно не граница длины строки, если строки считать в символах.
Оказывается все дело не в длине, а в размере байт.
Но вот справка говорит обратное, что в StringInit должна быть именно длина.
В общем как я понял, mql-овский тип string это указатель, и работать с этим типом нужно как с указателем.
Нуль имеется
Если настаивайте, то будь по-вашему.
Я тоже так думал, у строки длина 164, ставил 165, ставил 330.
330 это уже явно не граница длины строки, если строки считать в символах.
Оказывается все дело не в длине, а в размере байт.
Но вот справка говорит обратное, что в StringInit должна быть именно длина.
В общем как я понял, mql-овский тип string это указатель, и работать с этим типом нужно как с указателем.
mql-овский тип string это структура, которая содержит в себе указатель, длину строки и возможно что-то ещё.
Когда Вы передаёте строку в DLL, передаётся только указатель. Длину строки необходимо передавать вручную.
И всегда следить чтобы не выйти за пределы строки.
Все изменения размеров строки только на стороне MQL.
На стороне DLL, нужно внимательно читать справку по функциям, которые Вы используете. Все Ваши проблемы только в этом.
sizeof( wchar_t* ) возвращает размер указателя. Это совсем не то, что Вам нужно.
mql-овский тип string это структура, которая содержит в себе указатель, длину строки и возможно что-то ещё.
Когда Вы передаёте строку в DLL, передаётся только указатель. Длину строки необходимо передавать вручную.
И всегда следить чтобы не выйти за пределы строки.
Все изменения размеров строки только на стороне MQL.
На стороне DLL, нужно внимательно читать справку по функциям, которые Вы используете. Все Ваши проблемы только в этом.
sizeof( wchar_t* ) возвращает размер указателя. Это совсем не то, что Вам нужно.
Правильно, я выделяю буфер под строку out, и инициализирую её пробелами.
Далее передаю эту строку(указатель) в dll.
В dll в out копируются wchar_t* данные, то есть тоже указатель. По логике проблем не должно возникать.
Как я понимаю согласно справке, функция StringInit и должна задавать длину строки.
Но тут ещё с самой функцией StringInit непонятки, указывал длину строки, фигня лезла, указал размер указателя, всё заработало.
Не пойму о какой ручной передаче длины строки вы имели ввиду.
И если использовать sizeof(wchar_t) без указателя, то строка начинает плыть лишними символами, что вызывает проблему с парсингом и утечкой.
Для передачи строк в dll использовался пример Рената, из его статьи как писать dll.
Но вот почему то именно если передаю без указателя sizeof(wchar_t), то строка плывёт, а с указателем sizeof(wchar_t*) проблем нет.
Имне кажется логично, я же копирую строку как указатель, то и размер нужно передавать указателя, а не типа.
Попробуйте
После того как это сработает, я бы обратите внимание на wcscpy.
Попробуйте
После того как это сработает, я бы обратите внимание на wcscpy.
Нет, так не сработало, строка не передается, но и проблем не возникает.
А вот так без нуля сработало, но так плывёт конец строки лишними символами.
Нет, так не сработало, строка не передается, но и проблем не возникает.
А вот так сработало, но снова плывёт конец строки лишними символами.
Читаем внимательно доки по std::wcslen
Returns the length of a wide string, that is the number of non-null wide characters that precede the terminating null wide character.
Если don't undestand, то гугл хелп ми:
Возвращает длину широкой строки, то есть количество ненулевых широких символов, которые предшествуют завершающему нулевому широкому символу. Если совсем не верим, то пишем проверку:
Запускаем и видим:Переписываем:
Вывод: сначала читаем доки, не поняли, идем на форум, читаем форум, помним, что тот, кто пишет на форуме, возможно такой же гуру как и ты сам, соответственно, после форума опять открываем доки, пишем тест, охреневаем от знаний гуру на форуме, считаем себя вумным как утка, пишем код, охреневаем от багов, опять цикл доки-форум, узнаем про ub, находим где накосячили, охреневаем от своей тупости.
Примерно так и происходит.
PS. Это С, это хардкор, тут форумы курить не стоит, только серьезные издания и доки, только свои мозги.