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

 
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* ).

 

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

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

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

 
Roman:

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

Почему так происходит, уже объяснял выше.

 
Koldun Zloy:

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

Ну так подскажите раз не так сложно.
Или вы считаете что это нормальное поведение?

 
Roman:

Ну так подскажите раз не так сложно.
Или вы считаете что это нормальное поведение?

То есть, Вы даже не планируете ни в чём разбираться, просто дай Вам готовый рецепт и всё?

Я не понимаю, зачем Вам заниматься программированием, если для Вас это в тягость, но это Ваше дело.


Как Вы думаете, захочет ли кто-то Вам помогать, если Вы задаёте вопрос, и не хотите показывать подробный воспроизводимый код,

то что Вам пишут или не читаете, или спорите с теми, кто знает намного больше?


Поэтому, готового рецепта не будет. Напишу общий принцип получения строки из DLL. Код напишете сами, если считаете себя программистом.


1. В MQL создаёте массив ushort.

2. Инициализируете его.

3. Передаёте массив и его размер в DLL.

4. В DLL копируете строку в этот массив, используя функцию wmemcpy_s().

5. Возвращаете из DLL длину скопированной строки.

6. В MQL создаёте строку из массива, используя функцию ShortArrayToString().

 
Комментарии, не относящиеся к этой теме, были перенесены в "Вопросы от начинающих MQL4 MT4 MetaTrader 4".
 

На одном из серверов (не MQ) МТ5 сходит с ума - грузит проц на 100% и интенсивно выводит в лог такие сообщения по разным инструментам:

HistoryBase постоянное самопроизвольное обновление

Графики моргают. Работать невозможно.

Есть ли возможность локально это пофиксить или единственный выход - ждать пока на сервере, видимо, не закончат какие-то игры?

 
Koldun Zloy:

То есть, Вы даже не планируете ни в чём разбираться, просто дай Вам готовый рецепт и всё?

Я не понимаю, зачем Вам заниматься программированием, если для Вас это в тягость, но это Ваше дело.

Как Вы думаете, захочет ли кто-то Вам помогать, если Вы задаёте вопрос, и не хотите показывать подробный воспроизводимый код,

то что Вам пишут или не читаете, или спорите с теми, кто знает намного больше?

Поэтому, готового рецепта не будет. Напишу общий принцип получения строки из DLL. Код напишете сами, если считаете себя программистом.


1. В MQL создаёте массив ushort.

2. Инициализируете его.

3. Передаёте массив и его размер в DLL.

4. В DLL копируете строку в этот массив, используя функцию wmemcpy_s().

5. Возвращаете из DLL длину скопированной строки.

6. В MQL создаёте строку из массива, используя функцию ShortArrayToString().

Да где вы увидели тут спор? Идёт рабочее обсуждение, не нужно переиначивать смысл в курятник, с высокомерным пафосом.
Не кто готового от вас не чего не просил. Думал вы с указателем знаете решение, ан нет, ошибся.
Это вы не читаете тему, тут давно уже о массивах была речь, и все прекрасно об этом знают.
И к массивам я давно уже склоняюсь. Но раз в mql есть string, почему бы его не использовать напрямую.
Вот как раз за баг в mql-овском string, копирования в него указателя, тут и идёт речь.
Я вам больше скажу, что не только через ushort можно решить всё. Вариантов с массивами много.
Но в моём случае не хочется использовать массивы, не всегда это рационально по структуре кода.
И тем более когда есть mql-овский string, с которым можно работать на прямую, но который должен работать корректно.

Причина обращения: