Obtenir le nombre de décimales de n'importe quel nombre (pas seulement les guillemets) en contournant Digits() dans MQL4 et MQL5 - page 16

 

Voici une autre tâche intéressante : réaliser une fonction de tri de tableaux plus rapide que la fonction intégrée ArraySort.

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

Est-il garanti que la taille de toutes les structures est divisée par la taille de toutes les variables ?

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

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

Puis-je réfléchir à une implémentation rapide de la traduction d'un tableau de structures (longueur multiple de sizeof(int)) vers et depuis un tableau int[]?

///

Simplement après avoir décrit une structure, écrivez quelques lignes supplémentaires avec une union qui inclut cette structure et un tableau.

struct SS{
   int a;
   double b;
};

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


Il est même possible de ne pas écrire après chaque structure, mais d'en faire un modèle - ce qui vous convient.

 
Dmitry Fedoseev:

La taille de toutes les structures garanties est-elle divisée par la taille de toutes les variables ?

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Obtenir le nombre de décimales de n'importe quel nombre (pas seulement les guillemets) en contournant Digits() dans MQL4 et MQL5

fxsaber, 2018.12.07 15:12

Puis-je réfléchir à une implémentation rapide de la traduction d'un tableau de structures (longueur multiple de sizeof(int)) vers et depuis un tableau int[] ?

En général, la solution se trouve sur le même lien, mais à cause de la polyvalence, il y a un frein à cet endroit. La multiplicité est donc une condition supplémentaire compréhensible.

Ceci est également apparu.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Nouvelle version de MetaTrader 5 build 1930 : fenêtre graphique flottante et bibliothèque .Net dans MQL5

MetaQuotes Software Corp., 2018.10.25 17:18

  1. MQL5 : La propriété pack( integer_value ) a été ajoutée pour les structures. Il vous permet de définir l'alignement des champs dans la structure, cela peut être nécessaire lorsque vous travaillez avec des DLL. Pour integer_value peut avoir les valeurs 1, 2, 4, 8 et 16.
    Si la propriété n'est pas définie, l'alignement par défaut est de 1 octet - pack(1).

    Exemple d'utilisation :
    //+------------------------------------------------------------------+
    //| 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));
      }
    //+------------------------------------------------------------------+
    Sortie :
    sizeof(A)=5
    sizeof(B)=8
    De plus amples informations sur l'alignement dans les structures sont disponibles sur MSDN.
 
Dmitry Fedoseev:

Simplement, après avoir décrit la structure, écrivez quelques lignes supplémentaires avec une union qui inclut cette structure et le tableau.

Vous pouvez même ne pas écrire après chaque structure, mais utiliser un modèle - ce qui est plus pratique.

Je ne comprends pas. Si vous voulez participer, veuillez écrire votre variante.

 
fxsaber:

Puis-je réfléchir à une implémentation rapide de la traduction d'un tableau de structures (longueur multiple de sizeof(int)) vers et depuis un tableau int[]?

pourquoi en int ? et pas en char ?

(et il sera plus long - il sera copié plus rapidement)

 
Ilya Malev:

Apparemment, le vôtre est déjà plus rapide :)

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


Je vais essayer de l'accélérer considérablement.

 
fxsaber:

Je ne comprends pas. Si vous souhaitez participer, veuillez écrire votre option.

Je l'ai fait.

 
fxsaber:

Dans le cas général, la solution se trouve dans le même lien, mais en raison de l'universalité, il existe des freins. La multiplicité est donc une condition supplémentaire compréhensible.

Ceci apparaît également.

Qui va contrôler cette multiplicité ?