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

 

Наблюдение за памятью.

У меня в коде около тысячи раз выполняется CopyRates.

Затем массив котировок каким-то образом обрабатывается, и в конце этого я вызываю:

         ArrayRemove(МассивКотировок,0,РазмерМассива);

         ArrayFree(МассивКотировок);

         ArrayResize(МассивКотировок,0);

         ArrayFree(МассивКотировок);

         ZeroMemory(МассивКотировок);

(просто эксперементировал по-разному)

Результат - память все равно геометрически растет и забивается, вместе с ней и нагрузка на процессоры - процессор на i7 забивается на 80% в совокупности по всем логическим ядрам, память больше Гига.

Пока что удалось ограничить потребление ресурсов с помощью сторонней программы - процессор не больше 15% и память не больше Гига.

Вопрос - это баг или особенность платформы?

[Удален]  
Можно ли жёстко выбрать кодировку исходников? Я знаю, что когда символы лишь ascii, то она однобайтовая, иначе utf-16. Можно ли utf-8?
[Удален]  

Кстати, странное поведение метаэдитора, желательно исправить:

fn_call();/////////////////////

двойной клик по слешам выделяет слеши с предыдущим символом (если там не цифра/буква).

Почему неудобно? Сделали временную правку в коде, выделили место таким образом, далее нужно быстро выделить и удалить одни слеши.

 

Всё же вернусь к вопросу передачи из dll строк, wchar_t * как указатель.
Из статьи Рената по работе со строками в dll понятно, что в mql тип string принимает из внешней dll указатель на строку wchar_t *.
То есть в dll  отправляем wchar_t *, в mql принимаем как string &.
Но почему то Сишная функция 

wcscpy_s(wchar_t *dest, rsize_t dest_size, const wchar_t *src);

работает не корректно, т.е. указатель на строку wchar_t * dest, в mql принимается , но с перебоями, то поступает то нет.
Иногда падает терминал, программа завершена.

С функцией

wcscpy(wchar_t *dest,  const wchar_t *src);

терминал не падает, но так же строки поступают с перебоями.
Прошу поправить в ближайшем билде.

ЗЫ. Забыл уточнить, что указатель  wchar_t *  передаётся из другого потока.
т.е. функция wcscpy_s или wcscpy, вызываются в отдельном потоке.

 
Roman:

Всё же вернусь к вопросу передачи из dll строк, wichar_t * как указатель.
Из статьи Рената по работе со строками в dll понятно, что в mql тип string принимает из внешней dll указатель на строку wichar_t *.
То есть в dll  отправляем wichar_t *, в mql принимаем как string &.
Но почему то Сишная функция 

работает не корректно, т.е. указатель на строку wichar_t * dest, в mql принимается , но с перебоями, то поступает то нет.
Иногда падает терминал, программа завершена.

С функцией

терминал не падает, но так же строки поступают с перебоями.
Прошу поправить в ближайшем билде.

ЗЫ. Забыл уточнить, что указатель  wichar_t *  передаётся из другого потока.
т.е. функция wcscpy_s или wcscpy, вызываются в отдельном потоке.

А память под string dest, кто выделять будет?
 
Vladimir Simakov:
А память под string dest, кто выделять будет?

Память выделена в mql коде как

#import "Dll.dll"
   void Func(string task, string & out);
#import 

string оut;
StringInit(out, 165, 32);

out и передаётся как указатель на выделенную память, так как string в mql, это wchar_t* в dll

Func("Task", out);
 
Roman:

Память выделена в mql коде как

out и передаётся как указатель на выделенную память, так как string в mql, это wichar_t* в dll

Ой как запущено...

Я не знаю реализацию string, могу только догадываться, но, судя по ошибке, при string out на стеке создается указатель, который инициализируется 0x00000000 и Вы благополучно в dll разыменовываете нулевой указатель.

 
Vladimir Simakov:

Ой как запущено...

Я не знаю реализацию string, могу только догадываться, но, судя по ошибке, при string out на стеке создается указатель, который инициализируется 0x00000000 и Вы благополучно в dll разыменовываете нулевой указатель.

Sorry, StringInit не заметил(((
 
Roman:

Память выделена в mql коде как

out и передаётся как указатель на выделенную память, так как string в mql, это wchar_t* в dll

Саму dll покопай, скорее всего там что-то. Последнее время плотно гоняю данные из mql в сторонние приложения С++/С#, никаких проблем никогда не было.

 
Vladimir Simakov:

Саму dll покопай, скорее всего там что-то. Последнее время плотно гоняю данные из mql в сторонние приложения С++/С#, никаких проблем никогда не было.

В dll всё просто, лишнее убрано для наглядности, показана сама идея

wchar_t* out        = L"";
const wchar_t* data = L"";

while(condition)
{
   data = getData();  //getData библиотечная функция возвращает const wchar_t*
   wcscpy(out, data);
}

Вывожу результат data  в консоль, все строки в консоли идут чётко без пропусков и без глюков.
Передаю в mql через wcscpy(out, data) начинаются траблы
А если передаю проверочную строку написанную руками

wchar_t* out        = L"";
const wchar_t* data = L"";

while(condition)
{
   data = L"{\"p\":\"2000\"}";  //проверочная строка
   wcscpy(out, data);
}

То почему то проблем нет.

Хм, а тип string в mql учитывает терминальный ноль wchar_t*  ???

Файлы: