Особенности языка mql5, тонкости и приёмы работы - страница 313

 

Есть какой-то способ выбрать какой цикл использовать в зависимости от значения bool переменной? Внутри циклов всё одно и то же, поэтому хочется выбрать сам цикл 1 раз.

Есть bool переменная Up. Если её значение true нужен цикл LOOP_Up, если false LOOP_Down.

#define LOOP_Up   for(i = 21;    i >= start; i--)
#define LOOP_Down for(i = start; i <  22;    i++)
if(Up)  LOOP_Up   else LOOP_Down {

При таком варианте получается ошибка:

illegal 'else' without matching 'if'

Так тоже не работает:

if(Up) LOOP_Up if(!Up) LOOP_Down {
 
Andrei Iakovlev #:
  int start = 0;
  int end = 21;
  bool up = false;
  
  for (int i = up ? end : start; up ? i >= start : i < end; up ? i-- : i++) {
    Print(i);
  }
 
Andrei Iakovlev #:

#define   LOOP_Up(loop_body)   for(i = start; i <  22;    i++) loop_body
#define   LOOP_Down(loop_body) for(i = 21;    i >= start; i--) loop_body
void OnStart() {
   #define   LOOP_BODY { int res = MathRand(); printf("index=%d, result=%d", i, res); }
   if(Up) LOOP_Up(LOOP_BODY) else LOOP_Down(LOOP_BODY)
}
 
dcstoyanov #:
amrali #:

Спасибо. Познавательно.
 
Andrei Iakovlev #:
Есть какой-то способ выбрать какой цикл использовать в зависимости от значения bool переменной?
// перебор элементов от first до last в требуемую сторону, в зависимости от last больше или меньше чем first
for( int i=first, increment=(last>=first?1:-1) ;
      i!=last+increment ;
      i+=increment ) {
      ...
}
как-то примерно так :-) 
 
Maxim Kuznetsov #:
как-то примерно так :-) 

Интересно реализовано. Спасибо.

amrali #:

Так тоже можно:

#define LOOP_BODY {...}
#define LOOP_Up   for(i = start; i <  22;    i++) LOOP_BODY 
#define LOOP_Down for(i = 21;    i >= start; i--) LOOP_BODY
if(Up) 	LOOP_Up   else LOOP_Down
 
Andrei Iakovlev #:

Есть какой-то способ выбрать какой цикл использовать в зависимости от значения bool переменной? Внутри циклов всё одно и то же, поэтому хочется выбрать сам цикл 1 раз.

#define LOOP_Up   for(i = 21;    i >= start; i--)
#define LOOP_Down for(i = start; i <  22;    i++)
if(Up)  LOOP_Up   else LOOP_Down {

При таком варианте получается ошибка

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

Поэтому ваш вариант разворачивался в:

if(Up)
   for(i = 21;    i >= start; i--)
else
   for(i = start; i <  22;    i++) {
      //...
   }
После первого for() нет тела цикла, а идёт сразу else. Об этом и сообщается в ошибке.
 
Yuriy Bykov #:
После первого for() нет тела цикла, а идёт сразу else. Об этом и сообщается в ошибке.

Я понял.

dcstoyanov #:
up ? i >= start : i < end

Не знал, что в условном операторе ? : во 2-ом и 3-ем операндах можно использовать выражения операций отношения, а проверить не догадался. Давно было интересно, как можно быстро поменять ">" на "<".

bool h = true; char g = 3, q = 4;
Print((h ? g > q : g < q) ? 5 : 6);
 
Andrei Iakovlev #:

Не знал, что в условном операторе ? : во 2-ом и 3-ем операндах можно использовать выражения операций отношения, а проверить не догадался. Давно было интересно, как можно быстро поменять ">" на "<".

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

Друзья, напомните пожалуйста, где то читал про конструкторы и деструкторы. Порядок создания и уничтожения, но никак не могу найти...

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

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


Покажите примеры пожалуйста пару примеров, особенно про уничтожение.