Новая версия платформы MetaTrader 5 build 3091: Улучшения в работе - страница 14

 
A100 #:

Из описания это не следует, иначе можно требовать NULL и для Str2 (а потом заявить почему Str2 не "")

Сотню раз находили ошибки в документации, какой смысл занудствовать?

Кроме того, функции 

изначально (по умолчанию) не симметричные

Для NULL должен быть симметричный. {}-массив - NULL-строка. {0}-массив - пустая строка.

Спорить на данную тему - это страдать ерундой. Высказался и пошел другим заниматься.

 
" на всякий случай, ответ однажды был от разработчиков - Нормальной практикой проверки строки является сначала проверка на NULL (str==NULL), а потом, если не NULL, на пустую строку (str[0]==0) "
 
запоминаю все хоть не много странные фразы и т.д.
 
Fast235 #:

ты прочитал, что однажды разработчики сказали, что нужно проверять?

Прочитал.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Почему input string не имеют значение NULL?

Slava, 2016.12.13 15:36

Нормальной практикой проверки строки является сначала проверка на NULL (str==NULL), а потом, если не NULL, на пустую строку (str[0]==0)

Видимо поэтому в документации не написано про это undocumented

Какое отношение эта фраза имеет к поднятой теме?

 
fxsaber #:

Сотню раз находили ошибки в документации, какой смысл занудствовать?

Для NULL должен быть симметричный. {}-массив - NULL-строка. {0}-массив - пустая строка.

Спорить на данную тему - это страдать ерундой. Высказался и пошел другим заниматься.

Еще аргумент есть:

void OnStart()
{
    uchar ch[];
    StringToCharArray( NULL, ch );
    Print( GetLastError());
}

Результат: 4009 - Неинициализированная строка

Что само по себе говорит, что Разработчики уже подумали о результате
 
A100 #:

Еще аргумент есть:

тогда и так должна инициализироваться строка:

void OnStart()
{
   uchar Bytes[];

   Print(StringToCharArray(NULL, Bytes)); // 0

   const string Str = CharArrayToString(Bytes);
   const string s = func();
   
   Print(StringToCharArray(Str, Bytes));  // 1
   Print(StringToCharArray(s, Bytes));    // 0
}
//+------------------------------------------------------------------+
string func()
{
   return(NULL);
}
 
Igor Makanu #:

тогда и так должна инициализироваться строка:

У Вас нет проверки на ошибку GetLastError() после StringToCharArray(NULL,), а она (ошибка) есть в любом случае. Соответственно StringToCharArray не предполагает NULL в качестве аргумента, а значит (симметрично)  CharArrayToString не предполагает NULL в качестве результата

Более того:
void OnStart()
{  
    uchar Bytes1[] = { }; const string Str1 = CharArrayToString(Bytes1);
    Print(GetLastError());
}

Результат: 4006 - Массив неподходящего типа, неподходящего размера или испорченный объект динамического массива

Соответственно вывод

изначально ошибочный 

 
A100 #:

Соответственно вывод

изначально ошибочный 

Т.е. в данном конкретном случае он (результат) может (но не обязан) быть равен NULL, но не потому что это валидный результат работы функции CharArrayToString, а лишь только потому что (по общему правилу) в случае ошибки результат неопределен

 

Работа оптимизации на шести локальных агентах.

Каждый Агент потребляет более 1 Гб памяти. При этом тиков в символе менее двух миллионов - 120 Мб.

Такой перерасход памяти локальными агентами, возможно, случается, когда идет автоматический обрыв (через определенное количество проходов) оптимизации на одном символе и запускается такая же оптимизация на другом символе. Как будто, Агенты хранят в памяти тиковую историю предыдущих символов. Иначе сложно объяснить, куда расходуется память Агентами.


Возможно ли изменить политику работы с памятью Агентов?

ЗЫ Советник работает только с одним символом, режим по пипсам на реальных тиках. Т.е. никакие другие символы ни в каком виде не используются.
Причина обращения: