Obtener el número de decimales de cualquier número (no sólo las comillas) evitando Digits() en MQL4 y MQL5 - página 16

 

Aquí hay otra tarea interesante: hacer una función de ordenación de matrices más rápida que la incorporada ArraySort.

 
Ilya Malev:
sizeof(S)/sizeof(T)

¿Está garantizado que el tamaño de todas las estructuras se divide entre el tamaño de todas las variables?

struct SZ{
   char x1;
   char x2;
   char x3;   
};

Print(sizeof(SZ)/sizeof(int)); // 0
 
fxsaber:

¿Puedo pensar en una implementación rápida de la traducción de una matriz de estructuras (longitud múltiplo de sizeof(int)) hacia y desde una matriz int[]?

///

Simplemente, después de describir una estructura, escribe unas líneas más con una unión que incluya esta estructura y un array.

struct SS{
   int a;
   double b;
};

union UX{
   SS s;
   char a[sizeof(S)];
};


Incluso es posible no escribir después de cada estructura, sino hacer una plantilla - lo que sea conveniente para usted.

 
Dmitry Fedoseev:

¿Está garantizado el tamaño de todas las estructuras dividido por el tamaño de todas las variables?

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategia

Obtención del número de decimales de cualquier número (no sólo de las comillas) evitando Digits() en MQL4 y MQL5

fxsaber, 2018.12.07 15:12

¿Puedo pensar en una implementación rápida para convertir una matriz de estructuras (longitud múltiplo de sizeof(int)) a y desde una matriz int[]?

En general, la solución se encuentra en el mismo enlace, pero debido a la versatilidad hay un freno allí. Así que la multiplicidad es una condición adicional comprensible.

Esto también apareció.

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Nueva versión de MetaTrader 5 build 1930: Ventana de gráficos flotantes y biblioteca .Net en MQL5

MetaQuotes Software Corp., 2018.10.25 17:18

  1. MQL5: Se ha añadido la propiedad pack( integer_value ) para las estructuras. Permite establecer la alineación de los campos dentro de la estructura, puede ser necesario cuando se trabaja con DLL. Para integer_value puede tener los valores 1, 2, 4, 8 y 16.
    Si la propiedad no está definida, la alineación por defecto es de 1 byte - pack(1).

    Ejemplo de uso:
    //+------------------------------------------------------------------+
    //| Default packing                                                  |
    //+------------------------------------------------------------------+
    struct A
      {
       char              a;
       int               b;
      };
    //+------------------------------------------------------------------+
    //| Specified packing                                                |
    //+------------------------------------------------------------------+
    struct B pack(4)
      {
       char              a;
       int               b;
      };
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       Print("sizeof(A)=",sizeof(A));
       Print("sizeof(B)=",sizeof(B));
      }
    //+------------------------------------------------------------------+
    La salida:
    sizeof(A)=5
    sizeof(B)=8
    Más información sobre la alineación en las estructuras está disponible en MSDN.
 
Dmitry Fedoseev:

Simplemente, después de describir la estructura, escribe unas líneas más con una unión que incluya esta estructura y el array.

Puede incluso no escribir después de cada estructura, sino hacer una plantilla, lo que sea más conveniente.

No lo entiendo. Si quieres participar, escribe tu variante.

 
fxsaber:

¿Puedo hacer una lluvia de ideas sobre una implementación rápida de la traducción de una matriz de estructuras (longitud múltiplo de sizeof(int)) hacia y desde una matriz int[]?

¿por qué a int? y no a char?

(y será más largo - se copiará más rápido)

 
Taras Slobodyanik:

¿Por qué Int?

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategia

Obtención del número de decimales de cualquier número (no sólo de las comillas) evitando Digits() en MQL4 y MQL5

fxsaber, 2018.12.07 15:12

La aplicación práctica es el intercambio rápido de datos a través de los recursos. Mi variante es demasiado genérica, por lo que es lenta.

 
Ilya Malev:

Al parecer, el tuyo ya es más rápido :)

// Перевод массива тиков в массив int[].
int TicksToIntArray_fxsaber3( const MqlTick &Ticks[], int &Array[] )
{
  INTEGER<MqlTick> TickInteger;

  const int Size = ArraySize(Ticks);
  ArrayResize(Array, Size * sizeof(MqlTick) / sizeof(int));
  
  int j = 0;

  for (int i = 0; i < Size; i++)
  {
    TickInteger.Data = Ticks[i];

//    j += ArrayCopy(Array, TickInteger.Integer, j);
    for (int k = 0; k < sizeof(MqlTick) / sizeof(int); k++)
      Array[j++] = TickInteger.Integer[k];
  }

  return(j);
}

// Перевод массива int[] в массив тиков.
int IntArrayToTicks_fxsaber3( const int &Array[], MqlTick &Ticks[] )
{
  INTEGER<MqlTick> TickInteger = {0};

  const int Size = ArraySize(Array);
  ArrayResize(Ticks, Size * sizeof(int) / sizeof(MqlTick));
  
  int j = 0;

  for (int i = 0; i < Size; j++)
  {
//    i += ArrayCopy(TickInteger.Integer, Array, 0, i, sizeof(MqlTick) / sizeof(int));
    for (int k = 0; k < sizeof(MqlTick) / sizeof(int); k++)
      TickInteger.Integer[k] = Array[i++];

    Ticks[j] = TickInteger.Data;
  }

  return(j);
}


Intentaré acelerarlo considerablemente.

 
fxsaber:

No lo entiendo. Si desea participar, escriba su opción.

Lo hice.

 
fxsaber:

En el caso general, la solución está en el mismo enlace, pero debido a la universalidad hay frenos. Por lo tanto, la multiplicidad es una condición adicional comprensible.

Esto también aparece.

¿Quién controlará esta multiplicidad?