Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 183

 
Denis Kirichenko:

Colleghi, per favore aiutatemi a fare una macro, se possibile.

Ho bisogno di dichiarare dinamicamente un array bidimensionale. E anche la seconda dimensione deve essere cambiata. Si tratta di qualcosa come questo ciclo:

Naturalmente, il compilatore si tirerà indietro di fronte a questo:

Mi piacerebbe vedere una macro come la seguente:

Invece di una linea:

Grazie.

Uso un array di strutture e tutto funziona, compresa la copia

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

L'unica cosa è che devi scrivere i nomi dei campi quando vi accedi, ma mi sta bene

 
Se c'è un bisogno urgente di resettare variabili statiche/array (inclusi const) negli EA, è sufficiente un re-login.
 
fxsaber:
Se c'è un bisogno urgente di resettare variabili statiche/array (inclusi const) negli EA, è sufficiente un re-login.

Se avete bisogno di resettare TUTTE le variabili statiche (comprese quelle che voi stessi avete dichiarato come costanti), dovete cambiare l'architettura del progetto). IMHO naturalmente.

 

Puoi dirmi cosa specificare al posto di ???? per farlo funzionare? Grazie

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

Dovete dire alla funzione il nome del membro della classe con cui controllare l'array

 
Georgiy Liashchenko:

Puoi dirmi cosa specificare al posto di ???? per farlo funzionare? Grazie

Ho bisogno di un modo per dire alla funzione il nome del membro della classe con cui controllare l'array

Questa opzione:

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:

Una tale opzione:

Grazie, è un'opzione interessante. Non proprio quello che sto cercando però. Se ho capito bene il codice, si passa una funzione di ordinamento al lato destro, ma vi si scrivono già i membri della struttura. Significa che se ho bisogno di ordinare per un altro membro o un altro oggetto con il nome di un altro membro, dovrò creare una funzione separata per ogni caso. Purtroppo non è molto ottimista. Ma può essere) continuo la mia ricerca.

C'è qualcosa di simile in js, ma questa funzione con i membri è scritta all'interno della linea di ordinamento e assomiglia più a una semplice assegnazione di parametri, che non porta all'ingombro del codice. Sto cercando una variante universale, ma mi manca la conoscenza. Forse è fatto tramite qualche tipo di puntatore o mappatura, per favore aiutatemi.

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

Puoi dirmi cosa specificare al posto di ???? per farlo funzionare? Grazie

Dovete dire alla funzione il nome del membro della classe da usare per controllare l'array.

Una soluzione universale è stata postata sul forum. Dovrete cercarlo.

 
fxsaber:

Una soluzione unica è stata pubblicata sul forum. Devi cercarlo.

Per caso ti ricordi almeno quale sezione? È come cercare un ago in un pagliaio).
 
Georgiy Liashchenko:
Per caso ti ricordi almeno quale sezione? È come cercare un ago in un pagliaio).

Ricordo solo che è stato due mesi fa.

 
Georgiy Liashchenko:

Grazie, è un'opzione interessante. Non proprio quello che sto cercando però. Se ho capito bene il codice, si passa una funzione di ordinamento alla parte destra, ma in essa si prescrivono già i membri della struttura. Significa che se ho bisogno di ordinare per un altro membro o un altro oggetto con il nome di un altro membro, dovrò creare una funzione separata per ogni caso. Purtroppo non è molto ottimista. Ma può essere) continuo la mia ricerca.

C'è qualcosa di simile in js, ma questa funzione con i membri è scritta all'interno della linea di ordinamento e assomiglia più a una semplice assegnazione di parametri, che non porta all'ingombro del codice. Sto cercando una variante universale, ma mi manca la conoscenza. Forse questo è fatto attraverso una sorta di puntatori o di mappatura, per favore aiutatemi.

In realtà questo è ottimale. E permette di impostare condizioni di ordinamento più complesse.

Per esempio:

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

E comunque non ci sono altre soluzioni.

Motivazione: