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

 
Swan:
возможно, но таки вроде правильно передаётся. В окне "Глобальные Переменные" значение округляется, отображает 17 цифр.
18 таки...
 
TheXpert:
Юнион каст в помощь. Он в mql5 легальный даже через структуры.
MQL4. Чё можно изобразить?
 
artmedia70:
MQL4. Чё можно изобразить?
А разве новый MQL4 не подтянут до MQL5?
 
marketeer:
А разве новый MQL4 не подтянут до MQL5?
Не совсем. Хотя если судить по Хелпу, то практически одно и то же. Но мы же не будем судить. Нас результат интересует
 
artmedia70:
MQL4. Чё можно изобразить?

Щас посмотрим...

Вот скриптик с принципом, должно пахать и на 4 и на 5

struct DoubleContainer
{
   double value;
};

struct LongContainer
{
   long value;
};

long ToLong(double value)
{
   DoubleContainer d; d.value = value;
   LongContainer l = (LongContainer)d;
   return l.value;
}

double ToDouble(long value)
{
   LongContainer l; l.value = value;
   DoubleContainer d = (DoubleContainer)l;
   return d.value;
}

void OnStart()
{
   long l = 130462919691841406;
   double d1 = (double)l;
   long l1 = (long)d1;
   double d2 = ToDouble(l);
   long l2 = ToLong(d2);
}
 
Vinin:
Не совсем. Хотя если судить по Хелпу, то практически одно и то же. Но мы же не будем судить. Нас результат интересует
Вот TheXpert вроде показал, как добиться результата. В 4-ке уже достаточно от синтаксиса 5-ки.
 
TheXpert:

Щас посмотрим...

Вот скриптик с принципом, должно пахать и на 4 и на 5

Чё-то вообще жесть...

#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   long l = 130462919691841406;
   //--- приведение типов
   double d1 = (double)l;
   long l1 = (long)d1;
   //--- преобразование типов
   double d2 = ToDouble(l);
   long l2 = ToLong(d2);
   //--- поглядим чё натворили
   Print("long-значение l = "+IntegerToString(l));
   Print("long l привели к типу double d1 = "+DoubleToString(d1,Digits));
   Print("double d1 привели к типу long l1 = "+IntegerToString(l1));
   Print("long l преобразовали в double d2 = "+DoubleToString(d2,Digits));
   Print("double d2 преобразовали в long l2 = "+IntegerToString(l2));
   ToDoubleString(l);
  }
//+------------------------------------------------------------------+
struct DoubleContainer
{
   double value;
};
//+------------------------------------------------------------------+
struct LongContainer
{
   long value;
};
//+------------------------------------------------------------------+
long ToLong(double value)
{
   DoubleContainer d; d.value = value;
   LongContainer l = (LongContainer)d;
   return l.value;
}
//+------------------------------------------------------------------+
double ToDouble(long value)
{
   LongContainer l; l.value = value;
   DoubleContainer d = (DoubleContainer)l;
   return d.value;
}
//+------------------------------------------------------------------+
double ToDoubleString(long long_value) {
   string long_value_str=IntegerToString(long_value);
   double double_value=StrToDouble(long_value_str);
   Print("long_value = "+IntegerToString(long_value)+", double_value = "+DoubleToString(double_value,Digits));
   return double_value;
}
//+------------------------------------------------------------------+

long, преобразованный в double, отображается нулём. Хотя потом из этого double нуля нормально преобразуется обратно в long. Я не понимаю ничего...


Что за... ????????????

 
artmedia70:
А посмотреть в отладчике? Там ооочень маленькое ненулевое значение. Все же пашет, что надо-то еще?
 
TheXpert:
А посмотреть в отладчике? Там ооочень маленькое ненулевое значение. Все же пашет, что надо-то еще?

Смотри. Я отсылаю идентификатор окна (он long) в глоб. терминала (они double). Мне нужно, чтобы множество индикаторов, установленных на разные, любые графики (устанавливать их будет советник) считали значение id графика управляющего экстперта, и отсылали именно на этот график свои данные. Советник будет в свою очередь обрабатывать все эти данные и далее уже работать с ними. Я, видя, что в глобальных терминала записан ноль, не очень-то уверен, что индикатор получит именно нужный идентификатор нужного графика, и будет отсылать туда свои данные. Я вижу ноль. А это не совпадает с id графика, на котором работает советник. Мне нужно быть уверенным.
Если не получится нормально преобразовать данные, придётся через файл csv. Хотя, хотелось бы всё же решить проблему преобразования данных без потерь. А тут ещё и не потеря, а добавление 2 к истинному значению.

Пробовал преобразовать в string - та же ерунда - увеличивает на 2 отсылаемое значение long 130462919691841406:

//+------------------------------------------------------------------+
void ToDoubleString(long long_value) {
   string long_value_str=IntegerToString(long_value);
   double double_value=StrToDouble(long_value_str);
   Print("long_value = "+long_value_str+", double_value = "+DoubleToString(double_value,Digits));
}
//+------------------------------------------------------------------+

результат:

2014.07.07 00:45:08.513 LongToDouble EURUSD,H4: long_value = 130462919691841406, double_value = 130462919691841408.00000

Не пойму...

 

Та емае...

Перед передачей надо засунуть в дабл из лонга. Для глобальной  переменной. Там не нулевое значение, там просто дабл число от балды, оно может быть скажем 1.34*е-307 может быть 4.29*е+120, потому что там биты лонга.

После передачи распаковать из дабла в лонг.

Все.

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