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

 
A100:

А как они помогут?

Все равно возвращается(вызывается) 1, а не 2

переменная _Symbol константная
 
Ilyas:
переменная _Symbol константная

Тогда перегрузка тем более не поможет

int SymbolInfoTick(       string  ) { return 1; }
int SymbolInfoTick( const string& ) { return 2; }
void OnStart()
{
        Print( SymbolInfoTick( _Symbol )); //Error
}

будет ошибка уже при компиляции

 
Ilyas:

Строка передаётся по ссылке.

Мы уже давно перешли на "copy_on_write строки" -> при копировании одной строки в другую контент не копируется сразу (как это было раньше), увеличивается количество ссылок на буфер строки
Например, количество ссылок увеличивается при передаче строки по значению, в качестве параметра и уменьшается после вызова.

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

Это все на уровне компиляции определяется?

 

Ошибка компилятора:

class CArray
{  
};

int ArraySize(const CArray&);


void Main()
{
  CArray arr;
  ArraySize(arr);  // Нормально
  
  CArray arrays[1];
  ArraySize(arrays[0]); // 'arrays' - array required
}
[Удален]  
fxsaber:

Это все на уровне компиляции определяется?

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

 
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.   И никаких проверок нет при чтении стринга.