MQL4およびMQL5でDigits()をバイパスして任意の数値(引用符だけでなく)の小数点以下桁数を取得 - ページ 16

 

ここで、もう一つ興味深い課題があります。それは、配列のソート 関数を組み込みのArraySortよりも高速にすることです。

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

すべての構造体のサイズは、すべての変数のサイズで割り切れることが保証されていますか?

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

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

構造体の配列(sizeof(int)の倍数の長さ)をint[]配列と相互変換するための簡単な実装について ブレインストーミングを行うことはできますか?

///

単に構造体を記述した後に、この構造体と配列を含むユニオンを数行書いてください。

struct SS{
   int a;
   double b;
};

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


各構造の後に書かず、テンプレート化することも可能です。

 
Dmitry Fedoseev:

保証される全構造体のサイズを全変数のサイズで割っているか?

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

MQL4およびMQL5でDigits()をバイパスして任意の数値(引用符だけでなく)の小数点以下の桁数を取得する方法

fxsaber さん 2018.12.07 15:12

構造体の配列(sizeof(int)の倍数の長さ)をint[]配列と相互変換するための簡単な実装について ブレインストーミングを行うことは可能ですか?

一般的には、同じリンクに解決策があるのですが、汎用性があるため、そこでブレーキがかかってしまうのです。ですから、多重性は理解できる追加条件です。

これも登場しました。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

MetaTrader 5 build 1930の新バージョン:MQL5におけるフローティングチャートウィンドウと.Netライブラリ

メタクォーツ・ソフトウェア株式会社, 2018.10.25 17:18

  1. MQL5:構造体に対して pack( integer_value ) プロパティが追加されました。これは、構造内のフィールドの整列を設定することができます、それは、DLLで作業するときに必要になることがあります。integer_valueは1, 2, 4, 8, 16の値を持つことができる。
    プロパティが定義されていない場合、デフォルトのアライメントは1バイト- pack(1)となる。

    使用例
    //+------------------------------------------------------------------+
    //| 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));
      }
    //+------------------------------------------------------------------+
    出力します。
    sizeof(A)=5
    sizeof(B)=8
    構造体のアライメントに関する詳しい情報は、MSDNに 掲載されています。
 
Dmitry Fedoseev:

単純に、構造体を記述した後に、この構造体と配列を含むユニオンを数行記述します。

各構造の後に書かず、テンプレート化することも可能です。

理解できない。参加希望の方は、バリアントをお書きください。

 
fxsaber:

構造体の配列(長さが sizeof(int) の倍数)を int[] 配列と相互変換するための簡単な実装について ブレインストーミングできますか?

なぜint型なのか、char型ではないのか?

(そして長くなる-速くコピーされる)。

 
Taras Slobodyanik:

なぜIntなのか?

 
Ilya Malev:

どうやらあなたの方がすでに速いようです :)

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


かなりスピードアップしてみます。

 
fxsaber:

理解できない。参加希望の方は、オプションをお書きください。

しました

 
fxsaber:

一般的な場合、解は同じリンクの中にあるのですが、普遍性があるためブレーキがかかっています。したがって、多重性は理解しやすい追加条件である。

これも表示されます。

この多重性を誰がコントロールするのか?