Ограничения ПРЕПРОЦЕССОРА MQ4.

 

Использование подстановок define должно облегчать программисту жизнь. Но использовать их оказывается надо с оглядкой.

Обнаружил непонятное мне ограничение ПРЕПРОЦЕССОРА:

- при присваивании значения прямым образом проблем нет, а используя подстановку и при повышении разрядности числа свыше 9 define не работает!


#define LG1                            10
#define LG2                            100
#define LG3                            1000
#define LG4                            10000
#define LG5                            100000
#define LG6                            1000000
#define LG7                            10000000
#define LG8                            100000000
#define LG9                            1000000000
#define LG10                           10000000000
#define LG11                           100000000000
#define LG12                           1000000000000
///////////////////////////////////////////////////////////////
void start()
{
   double a = LG9;
   double b = LG10;
   double c = 1000000000.0;
   double d = 10000000000.0;
   
   Print("LG9 = ",DoubleToStr(a,8));
   Print("LG10 = ",DoubleToStr(b,8));
   Print("c = ",DoubleToStr(c,8));
   Print("d = ",DoubleToStr(d,8));
   return;
}
///////////////////////////////////////////////////////////////

2008.06.14 17:29:19 TEST_LIMIT_of_define EURUSD,M1: d = 10000000000.00000000
2008.06.14 17:29:19 TEST_LIMIT_of_define EURUSD,M1: c = 1000000000.00000000
2008.06.14 17:29:19 TEST_LIMIT_of_define EURUSD,M1: LG10 = 1410065408.00000000
2008.06.14 17:29:19 TEST_LIMIT_of_define EURUSD,M1: LG9 = 1000000000.00000000



Возможно есть еще какие-нибудь ограничения ПРЕПРОЦЕССОРА? Или ограничений быть не должно?

 
вспоминаем, как представляются числа...
 
notused писал (а) >>
вспоминаем, как представляются числа...

Вы можете объяснить работу этого кода?

 

VBAG, константы у тебя объявлены как целые числа (int), а они могут принимать значения только от -2147483648 до 2147483647. Если константа превышает указанный диапазон, то результат не определен.

#define D1     3000000000.0
#define I1     3000000000


void start() {
  double D2 = 3000000000.0;
  int    I2 = 3000000000; 
  
  Print("D1 = ", D1);
  Print("I1 = ", I1);
  Print("D2 = ", D2);
  Print("I2 = ", I2);
}

Если переменной I2 присвоить недопустимое значение - результат аналогичный.

 

Виноват, был не прав, унесло!

Конечно же все работает. И все понятно и хорошо.

Всем спасибо.

Вопрос снят, пост можно удалять.

Причина обращения: