Ошибки, баги, вопросы - страница 2579

[Удален]  
Roman:

Все строки я вывожу или на график в коммент, или в принт терминала, когда строка поступает её сразу видно, в комменте видно кривая она или нет.
Когда идут большие временные пропуски, то строка на графике редко появляется, а в принте дыры.
Сомнение что не поступает строка из сокета отпадает, тиковые данные поступают с частотой в миллисекунды.
Из сокета getData() приняли в переменную указатель, из переменной указателя  сразу копирую в mql, не каких обёрток.
Да задекларирована по феншую ))

В общем по любому траблы с mql-овским string. Испробовано уже и проверено много вариантов.
Строка из сокета идёт с терминальным нулём, и самая достоверная проверочная функция 
показывает проблему именно на mql

В общем поюзаю пока с sizeof(wichar_t*) посмотрю на поведение.
Но наверно чтобы обезопаситься от изменений от MQ, наверно действительно напишу строки на массивах.

Запись в файл - имел в виду на стороне dll, если в файл пишется, а в мкл не попадает, то это уже весомые аргументы с заявлением о баге, может попаравят.

А обёртка есть без вашего желания, MQ скрывают код/адреса от внешнего мира, всё идет не напрямую.

 
Vict:

Запись в файл - имел в виду на стороне dll, если в файл пишется, а в мкл не попадает, то это уже весомые аргументы с заявлением о баге, может поправят.

А обёртка есть без вашего желания, MQ скрывают код/адреса от внешнего мира, всё идет не напрямую.

Записал получаемые строки в файл. 
Так как сокетная функция возвращает указатель на строку, то в файл пишется указатель на строку, и потом этот указатель копируется в mql.
С помощью функции

wcscpy(out,  data);

Длина получаемой строки 164, в mql выделено 200

StringInit(out, 200, 32);

Скопированная строка полученная в mql получается ровная по длине, но идут жёсткие пропуски в копировании.
В скрипте mql цикл while крутится с Sleep(1)

Файлы:
458.PNG  71 kb
 
А если использовать функцию
wcsncpy(out, data, wcslen(data));
Тогда пропусков нет, но скопированные строки получаются не ровные, в конце строки появляются лишние символы.
Добавление wcslen(data)+1 не помогает.

Итог, из всех страниц которые я тут пишу.
mql-овский string не корректно принимает из dll, скопированный указатель на строку const wchar_t*
Файлы:
w6b.PNG  74 kb
qjv2.PNG  73 kb
09i3.PNG  6 kb
[Удален]  
Roman:

Правильно, я выделяю буфер под строку out, и инициализирую её пробелами.
Далее передаю эту строку(указатель) в dll. 

В dll в out копируются wchar_t* данные, то есть тоже указатель. По логике проблем не должно возникать.
Как я понимаю согласно справке, функция StringInit и должна задавать длину строки.
Но тут ещё с самой функцией StringInit непонятки, указывал длину строки, фигня лезла, указал размер указателя, всё заработало.
Не пойму о какой ручной передаче длины строки вы имели ввиду.

И если использовать sizeof(wchar_t) без указателя, то строка начинает плыть лишними символами, что вызывает проблему с парсингом и утечкой.
Для передачи строк в dll использовался пример Рената, из его статьи как писать dll.
Но вот почему то именно если передаю без указателя sizeof(wchar_t), то строка плывёт, а с указателем sizeof(wchar_t*) проблем нет.
Имне кажется логично, я же копирую строку как указатель, то и размер нужно передавать указателя, а не типа.

Иногда делаешь правильно - не работает.

Делаешь неправильно - кажется, что работает.

В таких случаях надо делать правильно и искать ошибку в другом месте.

[Удален]  
Roman:

Записал получаемые строки в файл. 
Так как сокетная функция возвращает указатель на строку, то в файл пишется указатель на строку, и потом этот указатель копируется в mql.
С помощью функции

Длина получаемой строки 164, в mql выделено 200

Скопированная строка полученная в mql получается ровная по длине, но идут жёсткие пропуски в копировании.
В скрипте mql цикл while крутится с Sleep(1)

1. В MQL копируется не указатель, а строка.

2. Вы в MQL выделили строку в 200 символов. Потом скопировали в неё 164 символа. После этого, посмотрите размер строки в MQL. Он остался 200.

 
Koldun Zloy:

Иногда делаешь правильно - не работает.

Делаешь неправильно - кажется, что работает.

В таких случаях надо делать правильно и искать ошибку в другом месте.

По этому чтобы было правильно, я отказался от memcpy, и использовал wcscpy или wcsncpy.
Результат, постом выше.

 
Koldun Zloy:

1. В MQL копируется не указатель, а строка.

_DLLAPI void fnReplaceString(wchar_t *text, wchar_t *from, wchar_t *to)
{
   wchar_t *cp;
   
   //проверка параметров
   if(text==NULL || from==NULL || to==NULL) return;
   if(wcslen(from)!=wcslen(to))             return;
 
   //поищем подстроку
   if((cp=wcsstr(text,from))==NULL)         return;

   //заменим
   memcpy(cp,to,wcslen(to)*sizeof(wchar_t));
}
#import "MQL5DLLSamples.dll"
void fnReplaceString(string & text, string from, string to);
#import


Раздел 3.3

 
Koldun Zloy:

2. Вы в MQL выделили строку в 200 символов. Потом скопировали в неё 164 символа. После этого, посмотрите размер строки в MQL. Он остался 200.

Длина а не размер! Длина в символах, размер в байтах.
Проверил, после получения строки из 164 символов, да длина так же осталась 200.
Какие мысли по этому поводу?

[Удален]  
Roman:

По этому чтобы было правильно, я отказался от memcpy, и использовал wcscpy или wcsncpy.
Результат, постом выше.

Я имел ввиду sizeof( wchar_t* ).

[Удален]  

Вам бы лучше со мной не спорить, а прочитать повнимательней эту статью. И разобраться, что там происходит.

Тогда и проблем не будет.

То что Вы хотите сделать, на самом деле не так сложно.