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

 
A100 #:

следующая строка будет считаться продолжением записи директивы.

Если что-либо может быть понято неправильно, то оно обязательно будет понято неправильно.

 
В этом и разница
        \ //(1)
          //(2)
          //(3)

Строка (1) - это самостоятельная строка

Строка (2) - это продолжение строки (1)

Строка (3) - это следующая самостоятельная строка

 
A100 #:

Строка (2) - это продолжение строки (1)

Интуитивно для меня это вторая строка того же макроса - продолжение.

У меня нет представления, что любой макрос - это всегда одна строка после применения.

 
A100 #:
#define MACRO unsigned int

Не пойму тогда чего Вы добиваетесь...

Если нужно сделать такую запись:

#define MACRO такая \
запись

... то и будет "такая запись"

А если нужно сделать неразрывную запись:

#define MACRO не\
разрывная запись

... то и будет "неразрывная запись"

А в чём где ошибки?

 
Artyom Trishkin #:

А если нужно сделать неразрывную запись:

... то и будет "неразрывная запись"

А в чём где ошибки?


Ошибка в том, что не будет.
https://www.mql5.com/ru/forum/1111/page3326#comment_47234481
 
Столкнулся с непонятной особенностью CChekGroup.

Если создать группу чек-боксов, например, из 20 items,
которая не помещается целиком в окошко на панели CAppDialog,
то естественным образом возникает полоса прокрутки,
и все корректно работает при действиях мышкой.

Однако если програмно поставить галку в боксе, который
находится за пределами окна, то это вызывает ошибку на этапе исполнения:

array out of range in 'CheckGroup.mqh' (222,17)

При этом боксы в пределах окна прекрасно чекаются програмно,
то есть галка появляется, и никаких ошибок...

m_check_group.Check(i,1<<i); где i - номер бокса

Подскажите, плиз, в чем может быть дело?
 
44ex #:
Столкнулся с непонятной особенностью CChekGroup.

Если создать группу чек-боксов, например, из 20 items,
которая не помещается целиком в окошко на панели CAppDialog,
то естественным образом возникает полоса прокрутки,
и все корректно работает при действиях мышкой.

Однако если програмно поставить галку в боксе, который
находится за пределами окна, то это вызывает ошибку на этапе исполнения:

array out of range in 'CheckGroup.mqh' (222,17)

При этом боксы в пределах окна прекрасно чекаются програмно,
то есть галка появляется, и никаких ошибок...

m_check_group.Check(i,1<<i); где i - номер бокса

Подскажите, плиз, в чем может быть дело?

Попробуйте вставить такую строку в метод CCheckGroup::Check() в файле CheckGroup.mqh:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CCheckGroup::Check(const int idx,const int value)
  {
//--- check
   if(idx>=m_values.Total())
      return(false);
//---
   bool res=(m_states.Update(idx,value) && Redraw());
//--- change value
   if(res && idx<64)
     {
      Comment("m_rows.Size()=",m_rows.Size(),", idx=",idx);
      if(m_rows[idx].Checked())
         Value(m_value|m_values.At(idx));
      else
         Value(m_value&(~m_values.At(idx)));
     }
//---
   return(res);
  }
//+------------------------------------------------------------------+

На экране будет отображаться количество объектов CCheckBox в массиве m_rows и индекс idx, передаваемый в метод, по которому предполагается доступ в объекту в массиве.

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

Соответственно, будет от чего отталкиваться для поиска и исправления ошибки в такой ситуации.

 
fxsaber #:

Интуитивно для меня это вторая строка того же макроса - продолжение.

У меня нет представления, что любой макрос - это всегда одна строка после применения.

Макрос после применения это всегда одна строка, но если Вам недостаточно теории, то вот подтверждающий пример:

#define MACRO Print(__LINE__);\
              Print(__LINE__);\
              Print(__LINE__);
void OnStart()
{
    MACRO
}
 
Artyom Trishkin #:

А в чём где ошибки?

Вот проще пример:

#define MACRO abc\
defg

int MACRO; //Error: 'defg' - semicolon expected

Компилятор не распознал abcdefg как единое целое

 
A100 #:

Макрос после применения это всегда одна строка, но если Вам недостаточно теории, то вот подтверждающий пример:

#define unsignedint double
#define MACRO1 unsigned\
int

void OnStart()
{
  Print(typename(MACRO1)); // хотите double.

  if (true)
  {
  // Тот же MACRO1, только сдвинул внутрь {} для лучшей читабельности.
  #define MACRO2 unsigned\
  int
  
    Print(typename(MACRO2)); // хотите uint.
    
  #undef MACRO2
  }
}


Получается, сдвинул макрос для лучшей читабельности и получил другой результат? Столь замечательный нюанс полезным не видится.


ЗЫ Предлагается такая запись?

#define unsignedint double

#ifdef __MQL5__
#define MACRO unsigned\
int
#endif // #ifdef __MQL5__


А вот более удобное визуальное (сдвинул пробелами внутри ifdef/endif) вложение уже меняет результат?

#define unsignedint double

#ifdef __MQL5__
  #define MACRO unsigned\
  int
#endif // #ifdef __MQL5__