Errores, fallos, preguntas - página 705

 
Yedelkin:
Y dejemos abierta la pregunta sobre los fallos de Print()? :)
Como quieras.
 
victorg:
Lo que sea.

BIEN. Entonces, me atreveré. Así, la descripción de la función Print() dice que "los datos del tipo double se imprimen con la precisión de 16 dígitos decimales después del punto". De hecho, resulta que la función Print() produce datos algo redondeados:

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.999999999716
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Основы языка / Типы данных / Вещественные типы (double, float) - Документация по MQL5
 
Yedelkin:

DE ACUERDO. Entonces, me atreveré. Así, la descripción de la función Print() dice que "los datos del tipo double se imprimen con la precisión de 16 dígitos decimales después del punto". En realidad, resultó que la función Print() produce datos ligeramente redondeados:

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, por lo tanto redondeado)

Parece que es como se describe. ¿Cuál es el fallo? ¿No se imprimen los ceros?
 
MetaDriver:
Todo parece ajustarse a la descripción. ¿Cuál es el problema? ¿No se imprimen los ceros?
El error consiste en que la función Print() no imprime"Datos del tipo doble con precisión de 16 dígitos decimales después del punto".
 
Yedelkin:
El error consiste en que la función Print() no muestra"Datos de tipo double con una precisión de 16 dígitos decimales después del punto".

comprobar

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

comprobar

No me tomé la molestia de comprobarlo.

//+------------------------------------------------------------------+
//|                                                      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));
  }
//+------------------------------------------------------------------+

En primer lugar, el compilador genera "conversión implícita de 'número' a 'cadena' victorg2.mq5 12 22".

Segundo,

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

 

Utilice la función PrintFormat apropiada para un control total del formato:

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
La impresión se realiza por defecto en el modo de redondeo normal de doble a 4 dígitos. Corregiremos la documentación.
Документация по MQL5: Общие функции / PrintFormat
Документация по MQL5: Общие функции / PrintFormat
  • www.mql5.com
Общие функции / PrintFormat - Документация по MQL5
 

Por favor, indique los punteros (handles) a las estructuras (preferiblemente también a las matrices, incluidas las estáticas).

Envolver en clases suele ser una mala solución:

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:

Por favor, indique los punteros (handles) a las estructuras (preferiblemente también a los arrays, incluidos los estáticos).

¿En qué sentido y por qué?

 
Renat:

1. en qué sentido y

2. ¿por qué?

1.

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

Para crear matrices de punteros a estructuras (arrays). con la consiguiente inicialización for(i){ S[i] = GetPointer(StaticStruct[i]); }

2. mantener matrices sólidas (empaquetadas) de datos significativos.

Importante cuando se trata de la salida de datos a búferes OpenCL sin procesar (o el envío a DLL, la escritura a archivos, etc.)

Al mismo tiempo, es posible reordenar los accesos a los datos (por ejemplo, al ordenar los punteros) sin reescribir los datos.