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

 
Yedelkin:
А вопрос про косяки функции Print() оставим открытым? :)
Как угодно.
 
victorg:
Как угодно.  

ОК. Тогда я возьму на себя наглость. Итак, в описании функции Print() сказано, что "Данные типа double выводятся с точностью до 16 десятичных цифр после точки". На самом деле оказалось, что функция Print() выводит несколько округлённые данные:

void OnStart()
  {
   double a,b;

   a=7.0/200.0;
   b=7.0/a;
   Print("Print(b)=",b);
   Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
  }

 

ND 0 victorg2 (EURUSD,M1) 11:04:42 Print(b)=200.0
MP 0 victorg2 (EURUSD,M1) 11:04:42 Print(DoubleToString(b,16))=199.9999999999999716
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Основы языка / Типы данных / Вещественные типы (double, float) - Документация по MQL5
 
Yedelkin:

ОК. Тогда я возьму на себя наглость. Итак, в описании функции Print() сказано, что "Данные типа double выводятся с точностью до 16 десятичных цифр после точки". На самом деле оказалось, что функция Print() выводит несколько округлённые данные:

ND 0 victorg2 (EURUSD,M1) 11:04:42 Print(b)=200.0

MP 0 victorg2 (EURUSD,M1) 11:04:42 Print(DoubleToString(b,16))=199.9999999999999716

                                                                                                 123.4567890123456(7>5, поэтому округление вверх)

Вроде всё соответствует описанию. В чём косяк?  Нули не выводятся?
 
MetaDriver:
Вроде всё соответствует описанию. В чём косяк?  Нули не выводятся?   
Косяк в том, что функция Print() не выводит "Данные типа double с точностью до 16 десятичных цифр после точки".
 
Yedelkin:
Косяк в том, что функция Print() не выводит "Данные типа double с точностью до 16 десятичных цифр после точки".

проверьте

 Print("Print(b)="+b);
 
sergeev:

проверьте

 Не поленился, проверил.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
void OnStart()
  {
   double a,b;
   a=7.0/200.0;
   b=7.0/a;
   //Print("Print(b)=",b);
   Print("Print(b)="+b);
   Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
  }
//+------------------------------------------------------------------+

 

Во-первых, при компиляции выдаётся: "implicit conversion from 'number' to 'string' victorg2.mq5 12 22".

Во-вторых,

IS 0 victorg2 (EURUSD,M1) 17:46:45 Print(b)=200
PJ 0 victorg2 (EURUSD,M1) 17:46:45 Print(DoubleToString(b,16))=199.9999999999999716

 

Для полного контроля формата используйте соответствующую функцию PrintFormat:

void OnStart()
  {
   double a,b;
   a=7.0/200.0;
   b=7.0/a;
   printf("Format: %.15lf",b);
   PrintFormat("Format: %.15lf",b);
  }

Format: 199.999999999999970
Format: 199.999999999999970
По умолчанию в Print используется обычный режим округления double до 4 знака. Документацию мы скорректируем.
Документация по MQL5: Общие функции / PrintFormat
Документация по MQL5: Общие функции / PrintFormat
  • www.mql5.com
Общие функции / PrintFormat - Документация по MQL5
 

Дайте пожалуйста указатели (хендлы) на структуры (желательно и на массивы, включая статические). 

Оборачивание в классы - часто плохое решение:

struct SEmpty
  {
  };
  
class CEmpty
  {
  };
void OnStart()
  {
   Print("sizeof(SEmpty) = ",sizeof(SEmpty));   
   Print("sizeof(CEmpty) = ",sizeof(CEmpty));
  }
2012.04.07 20:49:38    SizeOf_Test (USDJPY,M30)    sizeof(CEmpty) = 16
2012.04.07 20:49:38    SizeOf_Test (USDJPY,M30)    sizeof(SEmpty) = 0
 
MetaDriver:

Дайте пожалуйста указатели (хендлы) на структуры (желательно и на массивы, включая статические). 

В каком смысле и зачем?

 
Renat:

1.  В каком смысле и

2.  зачем?

1. 

CEmpty  *C[];  // Это работает.
SEmpty  *S[];  // Error: 'SEmpty' - class type expected SizeOf_Test.mq5 19      1

Для создания массивов указателей на структуры (массивы).  С последующей инициализацией   for(i){ S[i] = GetPointer(StaticStruct[i]); }

2.  Чтоб сохранять сплошную (упакованную) форму массивов значимых данных.

Важно при работе с выводом данных в сырые буферы OpenCL (или отправку в DLL, запись в файлы и т.п.)

При этом сохраняется (появляется) возможность переупорядочивания доступа к данным (например при сортировке указателей) без переписывания данных.

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