MetaTrader 4 Client Terminal build 610 - страница 77

 
Ув разработчики, отчего в свойствах индикатора на вкладке COLORS нет возможности менять свойства отображения буферов начиная с 9го? Оч неудобно половину выносить в INPUTS + убеждать пользователя что это фича а не баг. Вы про эту фичу не забыли случайно? Когда/если вспомните, плз рассмотрите возможность вместо номера (индекса) буфера выводить его метку (label), как в MT5 - намного удобней
 

Вот ещё со строками странная проблема. Вот такой скрипт (надуманный, просто чтобы показать суть проблемы). Копируем содержимое одной строки в другую через динамическую память средствами WinAPI. Создаём строку-источник, распределяем под неё память с помощью StringInit(), запоминаем размер буфера, записываем в неё некоторый текст. Также создаём строку-приёмник такого же размера. Затем функциями ВинАПИ выделяем в локальной куче память того же размера, что буферы строк, копируем в неё содержимое строки-источника, передавая её в соответствующую функцию по ссылке (при передаче строки по ссылке передаётся адрес её буфера, что нам и нужно), потом содержимое этой памяти копируем в строку-приёмник. Всё это делается внутри функции GetString(), которая и возвращает считанную из памяти строку.

#property strict

#import "kernel32.dll"
        uint LocalAlloc(uint uFlags, uint uBytes);
        uint LocalFree(uint hMem);
        void RtlMoveMemory(uint pDest, string &pSrc, int bytes);    // перегрузка для копирования строки в кучу
        void RtlMoveMemory(string &pDest, uint pSrc, int bytes);    // перегрузка для получения строки из кучи
#import

void OnStart()
{
        string sStr = GetString();
        printf("Строка в функции Start(): %s", sStr);
}

string GetString()
{
        // исходная строка
        string sSrs;
        StringInit(sSrs, 256);
        
        // строка назначения
        string sDest;
        StringInit(sDest, 256);
        
        // требуемый размер выделяемой памяти
        int nBuffLen = StringBufferLen(sSrs);
        
        // выделение памяти
        uint pBuff = LocalAlloc(0, nBuffLen);
        
        // исходный текст
        sSrs = "Some string";
        
        // копирование в память содержимого исходной строки
        RtlMoveMemory(pBuff, sSrs, nBuffLen);
        
        // копирование содержимого памяти в буфер строки назначения
        RtlMoveMemory(sDest, pBuff, nBuffLen);

        // почистим за собой
        LocalFree(pBuff);
        
        printf("Строка в функции GetString(): %s", sDest);
        return (sDest);
}

Функция корректно отрабатывает вплоть до выхода, значение возвращаемой строки перед выходом правильное. А вот та строка, которой функция возвращает свой результат, когда правильная, а когда нет: содержит только первую букву, как на скрине ниже. Проблема не постоянная, при отладке обычно не проявляется. Если после отладки кинуть этот скрипт на график, тоже обычно всё нормально, но если после этого перекомпилировать, то эта проблема появляется. Больше всего смущает то, что возвращаемое значение внутри функции перед выходом ВСЕГДА правильное. Что здесь не так? Это баг, или я что-то со строками в МТ не понимаю?

ЗЫ. Билд 610.

 
Spy:

Вот ещё со строками странная проблема. Вот такой скрипт (надуманный, просто чтобы показать суть проблемы). Копируем содержимое одной строки в другую через динамическую память средствами WinAPI. Создаём строку-источник, распределяем под неё память с помощью StringInit(), запоминаем размер буфера, записываем в неё некоторый текст. Также создаём строку-приёмник такого же размера. Затем функциями ВинАПИ выделяем в локальной куче память того же размера, что буферы строк, копируем в неё содержимое строки-источника, передавая её в соответствующую функцию по ссылке (при передаче строки по ссылке передаётся адрес её буфера, что нам и нужно), потом содержимое этой памяти копируем в строку-приёмник. Всё это делается внутри функции GetString(), которая и возвращает считанную из памяти строку.

Функция корректно отрабатывает вплоть до выхода, значение возвращаемой строки перед выходом правильное. А вот та строка, которой функция возвращает свой результат, когда правильная, а когда нет: содержит только первую букву, как на рисунке. Проблема не постоянная, при отладке обычно не проявляется. Если после отладки кинуть этот скрипт на график, тоже обычно всё нормально, но если после этого перекомпилировать, то эта проблема появляется. Больше всего смущает то, что возвращаемое значение внутри функции перед выходом ВСЕГДА правильное. Что здесь не так? Это баг, или я что-то со строками в МТ не понимаю?

ЗЫ. Билд 610.

В коде ошибка. Функция "RtlMoveMemory()" перемещает количество байт, а не количество символов.
 

StringBufferLen и возвращает размер в байтах. Но я уже разобрался, в чём дело. Вот в этом: "Если character=0 и размер new_len>0, то будет распределен буфер строки указанного размера и заполнен нулями. Размер строки будет равен нулю, так как весь буфер заполнен терминаторами строки" (из справки к функции StringInit). Инициализировал строки символами нулей, всё заработало.

Непонятно только, почему иногда всё-таки возвращался правильный результат. Ну да ладно, не важно уже.

 
ale002:
Ув разработчики, отчего в свойствах индикатора на вкладке COLORS нет возможности менять свойства отображения буферов начиная с 9го? Оч неудобно половину выносить в INPUTS + убеждать пользователя что это фича а не баг. Вы про эту фичу не забыли случайно? Когда/если вспомните, плз рассмотрите возможность вместо номера (индекса) буфера выводить его метку (label), как в MT5 - намного удобней
Буферов-то всего 8, если вы не в курсе ещё.
 
evillive:
Буферов-то всего 8, если вы не в курсе ещё.

Видимо это ты где-то пропустил. Ограничение исправлено. Я лично уже один индикатор правил на 10 буферов.
 
AlexeyVik:
Видимо это ты где-то пропустил. Ограничение исправлено. Я лично уже один индикатор правил на 10 буферов.

Да, с 613 билда видимо поправили.
 
evillive:
Да, с 613 билда видимо поправили.

Нет раньше. У меня старше 610 нету. Сегодня попытался на 614 обновиться, открылся к счёту MQ но обновление не пошло. Может потому, что папку WebInstall удалил. Да и не очень надо.
 
stringo:

Не ссорьтесь. Был всего лишь один билд, где по случайности для списка параметров пользовательских индикаторов был применён код списка параметров экспертов.

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


Вот за это спасибо! Буду ждать.
 

Выпустили бету 616 билда на серверах demo.metaquotes.net:443 и demo.metaquotes.net:444