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

 
Koldun Zloy:

Нет. Во время компиляции это ещё неизвестно.

Тогда как это поможет избежать огромного количества проверок при вызове SymbolInfoTick десятки миллиардов раз?

 
fxsaber:

Тогда как это поможет избежать огромного количества проверок при вызове SymbolInfoTick десятки миллиардов раз?

Никак. Это только помогает не копировать саму строку без необходимости.

 
Koldun Zloy:

Никак. Это только помогает не копировать саму строку без необходимости.

Тогда очевидно, что решение со ссылкой на string для SymbolInfo-функций является правильным, если хочется от Оптимизатора большей эффективности.

 

У меня отказывается работать отладчик в одном моём проекте. При чем, его поведение сложно предсказать. Иногда он просто отказывается заходить на точки останова. В некоторые функции также заходить отказывается напрочь. Сначала я думал, причина в обновлениях (вдруг с отладкой что-то пошло не так). Но в других более простых программах всё вроде работает. Хотя я особо подробно не проверял, так как работаю над своим основным проектом. Он получился довольно сложным и включает в себя 15 модулей только моей разработки (количество стандартных модулей я не считал). Основной модуль содержит до 2000 строк. Я подумал, может быть всё дело в сложности проекта... К тому же, в некоторых местах я испольную макросы для повторяющихся фрагментов кода. Еще я использую стандартные элементы UI, такие как CAppDialog, CCheckGroup, CComboBox, CButton и т.п, которые я переписал под функционал моей программы. Возможно отладка не работает из-за них... Например, в метод CCheckGroup::itemCheckState(const string item), специально написанный мною, отладка не заходит. Метод находит элемент чек бокса и проверяет выбран ли он (его State):

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CCheckGroup::itemCheckState(const string item) {
  int total = m_strings.Total();
  
  if(total != m_states.Total())
    return -1;
    
  int i = 0;
  for(; i < total; i++) {
    if(m_strings.At(i) == item)
      return m_states.At(i);
  }
  
  return -1;
}

Вот какой UI получился у меня в итоге:

UI

Часть элементов UI временно засекречена. А вот ветка, где я рассказываю о том как я переопределил методы Show() и Hide() элемента CAppDialog: https://www.mql5.com/ru/forum/338301. Тогда компилятор ругался, возникла критическая ошибка.

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

На сколько я понимаю, причин может быть несколько.

  1.  Сложный код проекта, использование макросов
  2.  Усложнение кода использованием стандартных элементов UI, таких как CAppDialog, CCheckGroup, CComboBox, CButton (к которым я, к тому же, написал новые методы и переопределил некоторые из существующих)
  3.  Баг отладчика, связанный с новым билдом (возможно, хоть и маловероятно)

Информация о билде и системе:

2020.05.21 09:35:09.325 Terminal MetaTrader 5 x64 build 2433 started for MetaQuotes Software Corp.

2020.05.21 09:35:09.326 Terminal Windows 10 build 14393, Intel Core i5-5200U  @ 2.20GHz, 2 / 3 Gb memory, 61 / 380 Gb disk, IE 11, UAC, GMT+2

У кого возникали подобные проблемы с отладчиком и в чём может быть причина?
 
fxsaber:

Тогда очевидно, что решение со ссылкой на string для SymbolInfo-функций является правильным, если хочется от Оптимизатора большей эффективности.

Да не имеет никакого смысла эта ссылка, сказано же разработчиком.  Всё и так передаётся по ссылке.  Разница была только в древнем MQL4.   И никаких проверок нет при чтении стринга.
 
Alexey Navoykov:
Да не имеет никакого смысла эта ссылка, сказано же разработчиком.  Всё и так передаётся по ссылке.  Разница была только в древнем MQL4.   И никаких проверок нет при чтении стринга.

Только утомляют подобные утверждения.

int f1( string Str )
{
  return((Str += Str) == Str);
}

int f2( string &Str )
{
  return((Str += Str) == Str);
}

int Bench1( const int Amount = 1e8 )
{
  int Res = 0;
  string Str = NULL;
  
  for (int i = 0; i < Amount; i++)
    Res += f1(Str);
    
  Print(Res);
    
  return(Res);    
}

int Bench2( const int Amount = 1e8 )
{
  int Res = 0;
  string Str = NULL;
  
  for (int i = 0; i < Amount; i++)
    Res += f2(Str);

  Print(Res);
    
  return(Res);    
}

void OnStart()
{
  BENCH(Bench1())
  BENCH(Bench2())

  BENCH(Bench1())
  BENCH(Bench2())
}


        100000000
        Time[Bench1()] = 727585
        100000000
        Time[Bench2()] = 657464
        100000000
        Time[Bench1()] = 794205
        100000000
        Time[Bench2()] = 670440
 
fxsaber:

Только утомляют подобные утверждения.


Может быть, проще написать:

int f1( string Str )
{
  return(Str == NULL || Str == "");
}

?...

Зачем пить подобное?

int f1( string Str )
{
  return((Str += Str) == Str);
}
 
Mihail Matkovskij:

Может быть, проще написать:

Обсуждается другое.

 
fxsaber:

Только утомляют подобные утверждения.

чтобы не быть голословным, приведите бенч для тестов где строка не изменяется.
 
TheXpert:
чтобы не быть голословным, приведите бенч для тестов где строка не изменяется.
int f1( const string Str )
{
  return(Str + "1" != Str);
}

int f2( const string &Str )
{
  return(Str + "1" != Str);
}
        10000000
        Time[Bench1()] = 334596
        10000000
        Time[Bench2()] = 338559
        10000000
        Time[Bench1()] = 384711
        10000000
        Time[Bench2()] = 344346
Причина обращения: