Сюрприз от #define

 

Читаем в документации:

------------------------------------------

#define идентификатор значение

Идентификатор константы подчиняется тем же правилам, что и для имен переменных. Значение может быть любого типа

------------------------------------------

После этого пытаемся использовать в коде советника:

#define ONLYONE   true

и получаем ошибку при компиляции:

'ONLYONE' - defined value expected

 

не сюрприз.
дело в том что TRUE/FALSE сами определены как константы в #DEFINE
если Си программист xочет задать булевскую константу, он распечатает принтом ее значение Print (false," ",true);

и определит например так:
#define my_bool 1

 
Korey писал (а) >>

не сюрприз.
дело в том что TRUE/FALSE сами определены как константы в #DEFINE
если Си программист xочет задать булевскую константу, он распечатает принтом ее значение Print (false," ",true);

и определит например так:
#define my_bool 1

Спасибо, что про C напомнили ;)

Итак, пишем:

#define ONLYONE   1

и на конструкцию:

if ( ONLYONE )

получаем ошибку компиляции:

'ONLYONE' - comparison expression expected

Так что то, что Вы предожили - это не совсем то, чего хотелось. Я понимаю, что можно написать:

if ( ONLYONE == 1 )
но хочется читабильности от своих текстов.
 
изначально - удобную позицию заняли MQ
если бы языком МТ был бы Бэйсик, то претензий за него не оберешься,
а так - это не глюк но особенности Си.
 
Korey писал (а) >>
изначально - удобную позицию заняли MQ
если бы языком МТ был бы Бэйсик, то претензий за него не оберешься,
а так - это не глюк но особенности Си.

Какой, нафик, "Си"? Вы о чем? Если б он был роднёй Си, то у него были бы:

1) методы для запроса памяти и работы с ней;

2) структуры;

3) прекомпилятор понимал бы #ifdefine;

4) можно было б написать в коде: next_item = sourcearray[++index];

...

Где хотя бы это в MQL? Никакой он не родня Си!

 
MQ понимает как Си, вот тест в котором арифметический результат работает как логический.
Однако не полный Си - поскольку компилятор дает предупреждение если внутри if() нет логической хоть какой нибудь операции.
но работает правилоьно.
также вы обнаружили недостаток препроцессора - первые предопределняи не присваиваются последним.
int tr=1,fl=0;
   Print (True,"  ",False);
   if(tr)Print ("True");
   if(!fl) Print("false");
   if(!tr*fl)Print ("ariphmetic");
 
Korey писал (а) >>
MQ понимает как Си, вот тест в котором арифметический результат работает как логический.

Это не то, о чем я писал в первом посте.

Вместо

#define ONLYONE   true

можно использовать

bool ONLYONE = true;
но я имел ввиду другое.
 
PapaYozh писал (а) >>

Какой, нафик, "Си"? Вы о чем? Если б он был роднёй Си, то у него были бы:

1) методы для запроса памяти и работы с ней;


3) прекомпилятор понимал бы #ifdefine;

...

Где хотя бы это в MQL? Никакой он не родня Си!

И не будет, не надейтесь.

 
Rosh писал (а) >>

И не будет, не надейтесь.

Я уже давно реалист, что б на что-то еще надеяться. Хотел лишь сказать, что не стоит путать Божий дар с яичницей.

 
PapaYozh писал (а) >>

Я уже давно реалист, что б на что-то еще надеяться. Хотел лишь сказать, что не стоит путать Божий дар с яичницей.

Если бы Вы были реалистом, то не просили бы функции для работы с памятью.

 
Rosh писал (а) >>

Если бы Вы были реалистом, то не просили бы функции для работы с памятью.

А я и не просил, я лишь констатировал, что MQL не родня Си и привел аргументы.

:)