Errores, fallos, preguntas - página 710

 

Se necesita para determinar el tamaño de una matriz variable, pero sale el error:

void OnStart()
  {
   int j=1000;
//---
   double arrBalancesTS[][j];
  }

//---

//---

Funciona directamente con constantes (#define) y con un valor numérico, pero no así. ¿Por qué?

 
tol64:

Se necesita para determinar el tamaño de una matriz variable, pero sale el error:

//---

//---

Funciona directamente con constantes (#define) y con un valor numérico, pero no así. ¿Por qué?

Con las constantes, es una matriz estática, y con una variable, es dinámica. Y el tamaño de una dinámica está determinado por ArrayResize
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 

tol64:

¿Por qué?

La segunda dimensión y las siguientes tienen un tamaño fijo. Sólo puede ser fijado por una constante.
 
tol64:

Con constantes (#define) y con un valor numérico, funciona directamente, pero no así. ¿Por qué?

Porque al definir con #define, el compilador simplemente reemplaza la macro encontrada con la entrada correcta antes de la compilación. Por lo tanto, ve

void OnStart()
  {
//---
   double arrBalancesTS[][1000];
  }

que no contradice el lenguaje 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". De hecho, resulta que la función Print() produce datos algo 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.999999999716

La cuestión es que un número real se almacena en la memoria con no más de 17 dígitos significativos.

Pruebe este ejemplo para sentir la diferencia:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
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));

   Print("Print(StringFormat(b,%.15G))=",StringFormat("%.15G",b));
   Print("Print(StringFormat(b,%.16G))=",StringFormat("%.16G",b));
   Print("Print(StringFormat(b,%.17G))=",StringFormat("%.17G",b));
   Print("Print(StringFormat(b,%.18G))=",StringFormat("%.18G",b));
   
//19999999999999997
   Print("Print(StringFormat(b,%.15f))=",StringFormat("%.15f",b));
   Print("Print(StringFormat(b,%.16f))=",StringFormat("%.16f",b));
   Print("Print(StringFormat(b,%.17f))=",StringFormat("%.17f",b));
   
  }
//+------------------------------------------------------------------+
La descripción en la ayuda será corregida.
 
notused:
Con las constantes, es una matriz estática, y con una variable, es dinámica. Y el tamaño de una dinámica se determina usando ArrayResize.
TheXpert:
La segunda dimensión y las siguientes tienen un tamaño fijo. Sólo puede ser fijado por una constante.
Rosh:

Porque cuando se define con #define, el compilador simplemente reemplaza la macro encontrada con la entrada correcta antes de la compilación. Por lo tanto, ve

que no contradice el lenguaje MQL5.

Gracias. ¿Me pueden decir qué se puede hacer si el tamaño de un array en la primera y segunda dimensión se define en los cálculos y no puede ser una constante? Con ArrayResize(), se puede redimensionar sólo la primera dimensión, después de todo. ¿Y por qué puedo redimensionar un array aplicando un valor variable, mientras que no se puede establecer inicialmente?
 
tol64:
Gracias. ¿Me pueden decir qué se puede hacer si el tamaño de un array tanto en la primera como en la segunda dimensión está determinado por cálculos y no puede ser una constante? Con ArrayResize(), sólo puede cambiar el tamaño de la primera dimensión. ¿Y por qué se puede redimensionar un array mediante una variable, mientras que no se puede establecer inicialmente?
por favor, utilice las clases.
 
tol64:
Gracias. ¿Me pueden decir qué se puede hacer si el tamaño de un array tanto en la primera como en la segunda dimensión está determinado por cálculos y no puede ser una constante? Con ArrayResize(), sólo puede cambiar el tamaño de la primera dimensión. ¿Y por qué puedo redimensionar un array aplicando un valor variable, mientras que no se puede establecer inicialmente?
Echa un vistazo a la sección de operaciones de sobrecarga para un ejemplo para la clase CMatrix, tal vez esto funcione para ti.
 
Hola.

No encuentro cómo hacer que 2 clases intercambien mensajes.

Quiero que la clase A tenga un enlace con B y la clase B con A.
Tengo un error de compilación, tal vez MQL5 no permite eso. Pero sin ella la programación por objetos se utiliza en un 30%.

La solución podría ser escribir una gran clase de DIOS que sepa y conozca todo. Pero esto no me parece muy elegante.
¿Quién puede ayudar con la solución?

Gracias de antemano.
 
Razón de la queja: