Ottenere il numero di posizioni decimali di qualsiasi numero (non solo le virgolette) bypassando Digits() in MQL4 e MQL5 - pagina 16

 

Ecco un altro compito interessante: fare una funzione di ordinamento di array più veloce del built-in ArraySort.

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

La dimensione di tutte le strutture è garantita per essere divisa dalla dimensione di tutte le variabili?

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

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

Posso fare un brainstorming su una rapida implementazione della traduzione di un array di strutture (lunghezza multipla di sizeof(int)) da e verso un array int[]?

///

Semplicemente dopo aver descritto una struttura, scrivete qualche altra riga con un'unione che include questa struttura e un array.

struct SS{
   int a;
   double b;
};

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


E' anche possibile non scrivere dopo ogni struttura, ma fare un template - qualsiasi cosa sia conveniente per voi.

 
Dmitry Fedoseev:

La dimensione di tutte le strutture garantite è divisa per la dimensione di tutte le variabili?

Forum sul trading, sistemi di trading automatico e test di strategia

Ottenere il numero di posizioni decimali di qualsiasi numero (non solo le virgolette) bypassando Digits() in MQL4 e MQL5

fxsaber, 2018.12.07 15:12

Posso fare un brainstorming su una rapida implementazione della traduzione di un array di strutture (lunghezza multipla di sizeof(int)) da e verso un array int[]?

In generale la soluzione si trova allo stesso link, ma a causa della versatilità c'è un freno. Quindi la molteplicità è una comprensibile condizione aggiuntiva.

È apparso anche questo.

Forum sul trading, sistemi di trading automatico e test di strategia

Nuova versione di MetaTrader 5 build 1930: Finestra del grafico fluttuante e libreria .Net in MQL5

MetaQuotes Software Corp., 2018.10.25 17:18

  1. MQL5: è stata aggiunta la proprietà pack( integer_value ) per le strutture. Permette di impostare l'allineamento dei campi all'interno della struttura, può essere necessario quando si lavora con la DLL. Per integer_value può avere i valori 1, 2, 4, 8 e 16.
    Se la proprietà non è definita, l'allineamento predefinito è di 1 byte - pack(1).

    Esempio di utilizzo:
    //+------------------------------------------------------------------+
    //| 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));
      }
    //+------------------------------------------------------------------+
    Uscita:
    sizeof(A)=5
    sizeof(B)=8
    Maggiori informazioni sull'allineamento nelle strutture sono disponibili su MSDN.
 
Dmitry Fedoseev:

Semplicemente, dopo aver descritto la struttura, scrivete qualche altra riga con un'unione che include questa struttura e l'array.

Si può anche non scrivere dopo ogni struttura, ma template - qualsiasi cosa sia più conveniente.

Non capisco. Se vuoi partecipare, scrivi la tua variante.

 
fxsaber:

Posso fare un brainstorming su una rapida implementazione della traduzione di un array di strutture (lunghezza multipla di sizeof(int)) da e verso un array int[]?

perché a int? e non a char?

(e sarà più lungo - sarà copiato più velocemente)

 
Taras Slobodyanik:

Perché Int?

 
Ilya Malev:

A quanto pare il tuo è già più veloce :)

// Перевод массива тиков в массив 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);
}


Cercherò di accelerare considerevolmente.

 
fxsaber:

Non capisco. Se vuoi partecipare, scrivi la tua opzione.

L'ho fatto.

 
fxsaber:

Nel caso generale, la soluzione è nello stesso link, ma a causa dell'universalità ci sono dei freni. Quindi la molteplicità è una comprensibile condizione aggiuntiva.

Appare anche questo.

Chi controllerà questa molteplicità?