Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 183

 
Denis Kirichenko:

Liebe Kolleginnen und Kollegen, bitte helfen Sie mir, ein Makro zu erstellen, wenn das möglich ist.

Ich muss ein zweidimensionales Array dynamisch deklarieren. Und auch die zweite Dimension muss verändert werden. Das ist in etwa diese Schleife:

Natürlich wird sich der Compiler dagegen sträuben:

Ich würde gerne ein Makro wie das folgende sehen:

Statt einer Linie:

Ich danke Ihnen.

Ich verwende ein Strukturarray und alles funktioniert, einschließlich des Kopierens

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

Das einzige Problem ist, dass man die Namen der Felder schreiben muss, wenn man auf sie zugreift, aber damit habe ich kein Problem.

 
Wenn es dringend notwendig ist, statische Variablen/Arrays (einschließlich const) in EAs zurückzusetzen, reicht eine Neuanmeldung aus.
 
fxsaber:
Wenn es dringend notwendig ist, statische Variablen/Arrays (einschließlich const) in EAs zurückzusetzen, reicht eine Neuanmeldung aus.

Wenn Sie ALLE statischen Variablen zurücksetzen müssen (einschließlich derjenigen, die Sie selbst als Konstanten deklariert haben), müssen Sie die Projektarchitektur ändern.) IMHO natürlich.

 

Können Sie mir sagen, was ich anstelle von ???? angeben muss, damit es funktioniert? Dankeschön

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;
}

Sie müssen der Funktion den Namen des Klassenmitglieds mitteilen, um das Array zu überprüfen

 
Georgiy Liashchenko:

Können Sie mir sagen, was ich anstelle von ???? angeben muss, damit es funktioniert? Dankeschön

Der Funktion muss irgendwie der Name des Klassenmitglieds mitgeteilt werden, anhand dessen das Array überprüft werden soll

Diese Option:

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:

Eine solche Option:

Danke, das ist eine interessante Option. Allerdings nicht ganz das, was ich suche. Wenn ich den Code richtig verstanden habe, übergibst du eine Sortierfunktion an die rechte Seite, aber du schreibst bereits die Strukturelemente hinein. Das heißt, wenn ich nach einem anderen Mitglied oder einem anderen Objekt mit einem anderen Mitgliedsnamen sortieren muss, muss ich für jeden Fall eine eigene Funktion erstellen. Leider ist sie nicht sehr optimistisch. Aber es könnte sein), dass ich meine Suche fortsetze.

In js gibt es etwas Ähnliches, aber die Funktion mit Mitgliedern wird innerhalb der Sortierzeile geschrieben und sieht eher wie eine einfache Parameterzuweisung aus, was nicht zu einer Unordnung im Code führt. Ich bin auf der Suche nach einer universellen Variante, aber es fehlt mir an Wissen. Vielleicht geschieht das über eine Art von Zeigern oder Mapping, bitte helfen Sie mir.

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

Können Sie mir sagen, was ich anstelle von ???? angeben muss, damit es funktioniert? Dankeschön

Sie müssen der Funktion den Namen des Klassenmitglieds mitteilen, das für die Überprüfung des Arrays verwendet werden soll.

Eine universelle Lösung wurde im Forum gepostet. Sie werden danach suchen müssen.

 
fxsaber:

Im Forum wurde eine Einheitslösung gepostet. Sie müssen es nachschlagen.

Können Sie sich wenigstens an den Abschnitt erinnern? Es ist wie die Suche nach einer Nadel im Heuhaufen.)
 
Georgiy Liashchenko:
Können Sie sich wenigstens an den Abschnitt erinnern? Es ist wie die Suche nach einer Nadel im Heuhaufen.)

Ich weiß nur noch, dass es zwei Monate her ist.

 
Georgiy Liashchenko:

Danke, das ist eine interessante Option. Allerdings nicht ganz das, was ich suche. Wenn ich den Code richtig verstanden habe, übergeben Sie eine Sortierfunktion an die rechte Seite, aber Sie schreiben darin bereits die Strukturelemente vor. Das heißt, wenn ich nach einem anderen Mitglied oder einem anderen Objekt mit einem anderen Mitgliedsnamen sortieren muss, muss ich für jeden Fall eine eigene Funktion erstellen. Leider ist sie nicht sehr optimistisch. Aber es könnte sein), dass ich meine Suche fortsetze.

In js gibt es etwas Ähnliches, aber die Funktion mit Mitgliedern wird innerhalb der Sortierzeile geschrieben und sieht eher wie eine einfache Parameterzuweisung aus, was nicht zu einer Unordnung im Code führt. Ich bin auf der Suche nach einer universellen Variante, aber mir fehlen die Kenntnisse. Vielleicht ist dies durch eine Art von Zeigern oder Mapping getan, bitte helfen Sie.

Eigentlich ist das optimal. Außerdem können Sie damit komplexere Sortierbedingungen festlegen.

Zum Beispiel:

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;
}

Und andere Lösungen gibt es sowieso nicht.

Grund der Beschwerde: