mql5言語の特徴、微妙なニュアンスとテクニック - ページ 183

 
Denis Kirichenko:

同僚よ、可能な限り、マクロを作るのを手伝ってくれ。

2次元の配列を動的に宣言する必要があります。そして、2次元目も変えなければならない。このようなループのようなものです。

もちろん、コンパイラはこれを嫌がるだろう。

以下のようなマクロが欲しいです。

線の代わりに

ありがとうございます。

構造体配列を使っていますが、コピーも含めてすべてうまくいっています。

https://www.mql5.com/ru/forum/85652/page46#comment_15990662

ただ、アクセスするときにフィールドの名前を書かなければならないのが難点ですが、それはそれで構わないと思っています

 
EAの静的変数/配列(constを含む)を緊急にリセットする必要がある場合は、再ログインで十分です。
 
fxsaber:
EAの静的変数/配列(constを含む)を緊急にリセットする必要がある場合は、再ログインで十分です。

もし、すべての静的変数(あなた自身が定数として宣言したものを含む)をリセットする必要がある場合は、プロジェクトのアーキテクチャを変更する必要があります)。もちろんIMHOです。

 

の代わりに何を指定すればうまくいくか教えてください。ありがとうございました。

template<typename T, ?????>
void sortArray(T &_array[], ?????) {
   T array;
//---Sort Signals by Time
   for(int i = 0; i < ArraySize(_array); i++) {
      array = _array[i];
      for(int a = 1; a <= i; a++) {
         
            if(_array[i].????? < _array[a - 1].?????) {
               for(int b = i; b >= a; b--) {
                  _array[b] = _array[b - 1];
               }
               _array[a - 1] = array;
               break;
            }
 

   return;
}

配列のチェックを行うクラスメンバの 名前を関数に指定する必要があります。

 
Georgiy Liashchenko:

の代わりに何を指定すればうまくいくか教えてください。ありがとうございました。

この関数に、配列のチェック対象となるクラスメンバの 名前を指定する方法が必要です。

このオプションは

struct MyStruct
{
   double a;
   double b;
};

typedef bool (*FuncLess)( const MyStruct&, const MyStruct& );


bool LessA( const MyStruct& struct1, const MyStruct& struct2 )
{
   return struct1.a < struct2.a;
}

bool LessB( const MyStruct& struct1, const MyStruct& struct2 )
{
   return struct1.b < struct2.b;
}

template< typename T, typename FuncType >
void sortArray( T& _array[], FuncType func )
{
   T array;
//---Sort Signals by Time
   for( int i = 0; i < ArraySize( _array ); i++ )
   {
      array = _array[i];
      for( int a = 1; a <= i; a++ )
      {
         if( func( _array[i], _array[a - 1] ) )
         {
            for( int b = i; b >= a; b-- )
            {
               _array[b] = _array[b - 1];
            }
            _array[a - 1] = array;
            break;
         }
      }
   }
   return;
}

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   MyStruct structArray[25];
   
   for( int i = 0; i < 25; i++ )
   {
      structArray[i].a = rand();
      structArray[i].b = rand();
   }
   
   sortArray< MyStruct, FuncLess >( structArray, LessA );
   
   for( int i = 0; i < 25; i++ )
   {
      PrintFormat( "1: structArray[%i] = %f %f", i, structArray[i].a, structArray[i].b );
   }
   
   sortArray< MyStruct, FuncLess >( structArray, LessB );
   
   for( int i = 0; i < 25; i++ )
   {
      PrintFormat( "2: structArray[%i] = %f %f", i, structArray[i].a, structArray[i].b );
   }
}
 
Koldun Zloy:

そんな選択肢も。

ありがとうございます。興味深いオプションですね。でも、私が求めているものとはちょっと違う。私の理解が正しければ、右側にソート関数を渡すのですが、その中にすでに構造体メンバを 書き込んでいますね。つまり、他のメンバーや他のメンバーの名前を持つオブジェクトでソートする必要がある場合、それぞれのケースに対して別の関数を作らなければならないのです。残念ながら、あまり楽観視はできない。でも、もしかしたら......)と思いつつ、検索を続けています。

jsにも似たようなものがありますが、メンバーを持つ関数はソート行の中に書かれていて、見た目は単なるパラメーター割り当てに近いので、コードの散らかりにつながりません。ユニバーサルバリアントを探しているのですが、知識が不足しています。もしかしたら、何らかのポインタやマッピングで行われているのかもしれません、よろしくお願いします。

Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
  • www.mql5.com
Структура является набором элементов произвольного типа (кроме типа void). Таким образом, структура объединяет логически связанные данные разных типов. Объявление структуры Имя структуры нельзя использовать в качестве идентификатора (имени переменной или функции). Следует иметь ввиду, что в MQL5 элементы структуры следуют непосредственно друг...
 
Georgiy Liashchenko:

の代わりに何を指定すればうまくいくか教えてください。ありがとうございました。

この関数には、配列のチェックに使用するクラスメンバの 名前を指定する必要があります。

普遍的な解決策がフォーラムに掲載されました。探していただくことになります。

 
fxsaber:

フォーラムに一問一答が掲載されました。調べてみてください。

どのセクションか覚えていらっしゃいますか?干し草の中から針を探すようなものです(笑)。
 
Georgiy Liashchenko:
どのセクションか覚えていらっしゃいますか?干し草の中から針を探すようなものです(笑)。

覚えているのは、2ヶ月前ということだけです。

 
Georgiy Liashchenko:

ありがとうございます、面白いオプションですね。でも、私が求めているものとはちょっと違う。私の理解が正しければ、右辺にソート関数を渡していますが、その中にすでに構造体メンバを 規定しているのですね。つまり、他のメンバーや他のメンバーの名前を持つオブジェクトでソートする必要がある場合、それぞれのケースに対して別の関数を作らなければならないのです。残念ながら、あまり楽観視はできない。でも、もしかしたら......)と思いつつ、検索を続けています。

jsにも似たようなものがありますが、メンバーを持つ関数はソート行の中に書かれていて、見た目は単なるパラメーター割り当てに近いので、コードの散らかりにつながりません。普遍的なバリアントを探しているが、知識が不足している。おそらくこれは、何らかのポインタやマッピングによって行われているのだと思いますが、ご教授ください。

実はこれが最適なんです。そして、より複雑なソート条件を設定することができます。

例えば、こんな感じです。

struct MyStruct
{
   int A;
   int B;
   int C;
};

bool Less( const MyStruct& struct1, const MyStruct& struct2 )
{
   if( struct1.A != struct2.A ){
      return struct1.A < struct2.A;
   }
   if( struct1.B != struct2.B ){
      return struct1.B < struct2.B;
   }
   return struct1.C < struct2.C;
}

そして、どうせ他に解決策はないのだから。

理由: