#define как с ними работать ? - страница 2

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vasiliy Sokolov
27919
Vasiliy Sokolov  
Vladimir Pastushak:

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

Можно пару простых и пару сложных примеров ?

Больше интересует вопрос по скорости работы, есть ли смысл работать с дефайнами ?

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

#define это команда препроцессору компилятора, который перед компиляцией заменяет одну запись другой. Следовательно на производительности это никак не сказывается, т.к. все расчеты происходят до компиляции. Пример, пусть Вам нужно будет найти максимум массива с помощью ArrayMaximum. Если максимум не найден функция вернет -1. Эту константу можно заменить на более выразительное:

#define SEARCH_FAILED -1
double array[];
if(ArrayMaximum(array) == SEARCH_FAILED)
   printf("Не удалось найти максимум в массиве. Проверьте содержимое массива.");

Надо однако понимать, что #define - это наследство от старых языков программирования. Сейчас использование #define надо избегать, или по крайней мере использовать очень ограничено, на уровне простых подстановок. Поэтому не пытайтесь учиться тому, от чего уже в цивилизованном мире программирования давно стараются отмежеваться. 

Vasiliy Sokolov
27919
Vasiliy Sokolov  
Vladimir Pastushak:

Спасибо!

А как сделать функцию ?

#define  dt Digits()
#define  pt Point()
#define  ND (nm)  
double dr (return NormalizeDouble((nm)*(pt),(dt))) 

например то что сейчас я кручу

никак не получается, сообразить не могу...

То, что Вы делаете, отличный способ убиться. Ни в коем случае так не пишите.

Dmitry Fedoseev
55075
Dmitry Fedoseev  

https://www.mql5.com/ru/docs/basis/preprosessor/constant - объяснение проще не бывает и примеры есть - даже я понял.

Vladimir Pastushak
76334
Vladimir Pastushak  
Всем спасибо!
Alexey Volchanskiy
27144
Alexey Volchanskiy  
Maxim Dmitrievsky:


http://www.codenet.ru/progr/cpp/Macros.php

return там не надо

в принципе-то для ф-й это наверное не так актуально, потмоу что ф-ии и так быстро и легко вызываются :)


Замечу, у каждой функции есть пролог и эпилог, то есть даже такая ф-я будет медленнее чистого кода. Я не призываю заменять функции макросами ))) просто для справки

int n = 0;
void f()
{
   n++;
}

n++; // будет быстрее функции
Alexey Volchanskiy
27144
Alexey Volchanskiy  
Vasiliy Sokolov:

#define это команда препроцессору компилятора, который перед компиляцией заменяет одну запись другой. Следовательно на производительности это никак не сказывается, т.к. все расчеты происходят до компиляции. Пример, пусть Вам нужно будет найти максимум массива с помощью ArrayMaximum. Если максимум не найден функция вернет -1. Эту константу можно заменить на более выразительное:

Надо однако понимать, что #define - это наследство от старых языков программирования. Сейчас использование #define надо избегать, или по крайней мере использовать очень ограничено, на уровне простых подстановок. Поэтому не пытайтесь учиться тому, от чего уже в цивилизованном мире программирования давно стараются отмежеваться. 


дефайн плох тем, что не имеет типа, рекомендуется использовать константы

const int n = 100;

**

Aleksey Sergan
14710
Aleksey Sergan  
Alexey Volchanskiy:

Замечу, у каждой функции есть пролог и эпилог, то есть даже такая ф-я будет медленнее чистого кода. Я не призываю заменять функции макросами ))) просто для справки


Не будет.

Код:

double n = 0;
long niteration = 10000000000;
void OnStart()
  {

   datetime from = TimeCurrent();
   for( long i = 0; i < niteration; i++ ){
      n++;
   }
   datetime to = TimeCurrent();
   Print("time for n++:", (long)(to-from), " n=", n  );
   from = to;
   for( long i = 0; i < niteration; i++ ){
      f();
   }
   to = TimeCurrent();
   Print("time for f():", (long)(to-from), " n=", n  );
  }
//+------------------------------------------------------------------+

void f()
{
   n++;
}

Результат:

2017.07.27 20:53:10.788 callf (MXI-9.17,M15) time for n++:27 n=10000000000.0

2017.07.27 20:53:37.014 callf (MXI-9.17,M15) time for f():26 n=20000000000.0

Код:

long n = 0;
long niteration = 10000000000;
void OnStart()
  {

   datetime from = TimeCurrent();
   for( long i = 0; i < niteration; i++ ){
      n++;
   }
   datetime to = TimeCurrent();
   Print("time for n++:", (long)(to-from), " n=", n  );
   from = to;
   for( long i = 0; i < niteration; i++ ){
      f();
   }
   to = TimeCurrent();
   Print("time for f():", (long)(to-from), " n=", n  );
  }
//+------------------------------------------------------------------+

void f()
{
   n++;
}


Результат:

2017.07.27 20:55:10.144 callf (MXI-9.17,M15) time for n++:0 n=10000000000

2017.07.27 20:55:10.144 callf (MXI-9.17,M15) time for f():0 n=20000000000


Alexey Volchanskiy
27144
Alexey Volchanskiy  
Ренат говорит, что простые маленькие функции компилятор инлайнит. Директивы #inlain в языке нет, он делает это автоматически
Vasiliy Sokolov
27919
Vasiliy Sokolov  
Alexey Volchanskiy:
Ренат говорит, что простые маленькие функции компилятор инлайнит. Директивы #inlain в языке нет, он делает это автоматически

Инлайнит он не подетски. И функция не обязательно должна быть простой и маленькой что бы быть заинлайненой.

Короче, попытки обыграть компьютер на его поле приводят к неизбежному проигрышу. #define штука опасная, не даром от нее отказались в современных ЯП. Если она и осталась то на уровне '#define DEBUG' не больше.

Alexey Volchanskiy
27144
Alexey Volchanskiy  
Vasiliy Sokolov:

Инлайнит он не подетски. И функция не обязательно должна быть простой и маленькой что бы быть заинлайненой.

Короче, попытки обыграть компьютер на его поле приводят к неизбежному проигрышу. #define штука опасная, не даром от нее отказались в современных ЯП. Если она и осталась то на уровнеляции, я часто используютакже на уровне условной  '#define DEBUG' не больше.


А также на уровне условной компиляции

void OnStart() 
  { 
   #ifdef __MQL5__ 
      #ifdef _DEBUG 
         Print("Hello from MQL5 compiler [DEBUG]"); 
      #else 
        #ifdef _RELEASE 
           Print("Hello from MQL5 compiler [RELEASE]"); 
        #endif 
     #endif 
   #else 
      #ifdef __MQL4__ 
         #ifdef _DEBUG 
           Print("Hello from MQL4 compiler [DEBUG]"); 
        #else 
           #ifdef _RELEASE 
              Print("Hello from MQL4 compiler [RELEASE]"); 
           #endif 
        #endif 
     #endif 
   #endif 
  }

**

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий