Características del lenguaje mql5, sutilezas y técnicas - página 183

 
Denis Kirichenko:

Colegas, por favor ayúdenme a hacer una macro, si es posible.

Necesito declarar dinámicamente un array bidimensional. Y también hay que cambiar la segunda dimensión. Esto es algo así como este bucle:

Por supuesto, el compilador se opondrá a esto:

Me gustaría ver una macro como la siguiente:

En lugar de una línea:

Gracias.

Utilizo un array de estructura y todo funciona, incluso la copia

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

Lo único es que hay que escribir los nombres de los campos cuando se accede a ellos, pero me parece bien

 
Si hay una necesidad urgente de restablecer las variables estáticas / matrices (incluyendo const) en los EAs, un reinicio es suficiente.
 
fxsaber:
Si hay una necesidad urgente de restablecer las variables estáticas / matrices (incluyendo const) en los EAs, un reinicio es suficiente.

Si necesita restablecer TODAS las variables estáticas (incluyendo las que usted mismo declaró como constantes), necesita cambiar la arquitectura del proyecto). En mi opinión, por supuesto.

 

¿Puede decirme qué debo especificar en lugar de ???? para que funcione? Gracias

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

Tienes que decirle a la función el nombre del miembro de la clase para comprobar el array

 
Georgiy Liashchenko:

¿Puede decirme qué debo especificar en lugar de ???? para que funcione? Gracias

Es necesario indicar de alguna manera a la función el nombre del miembro de la clase por el que debe comprobar el array

Esta opción:

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 opción así:

Gracias, es una opción interesante. Sin embargo, no es lo que estoy buscando. Si he entendido bien el código, pasas una función de ordenación a la derecha, pero ya escribes los miembros de la estructura en ella. Esto significa que si necesito ordenar por otro miembro u otro objeto con el nombre de otro miembro, tendré que crear una función distinta para cada caso. Por desgracia, no es muy optimista. Pero puede ser) continúo mi búsqueda.

Hay algo similar en js, pero la función con los miembros se escribe dentro de la línea de ordenación y se parece más a una simple asignación de parámetros, lo que no lleva al desorden del código. Estoy buscando una variante universal, pero me faltan conocimientos. Tal vez se hace a través de algún tipo de punteros o mapeo, por favor ayuda.

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

¿Puede decirme qué debo especificar en lugar de ???? para que funcione? Gracias

Es necesario indicar a la función el nombre del miembro de la clase que se utilizará para comprobar la matriz.

Se ha publicado en el foro una solución universal. Tendrá que buscarlo.

 
fxsaber:

En el foro se publicó una solución única para todos. Tienes que buscarlo.

¿Recuerda al menos qué sección? Es como buscar una aguja en un pajar).
 
Georgiy Liashchenko:
¿Recuerda al menos qué sección? Es como buscar una aguja en un pajar).

Todo lo que recuerdo es que fue hace dos meses.

 
Georgiy Liashchenko:

Gracias, es una opción interesante. Sin embargo, no es lo que estoy buscando. Si he entendido bien el código, estás pasando una función de ordenación a la derecha, pero ya estás prescribiendo los miembros de la estructura en ella. Esto significa que si necesito ordenar por otro miembro u otro objeto con el nombre de otro miembro, tendré que crear una función distinta para cada caso. Por desgracia, no es muy optimista. Pero puede ser) continúo mi búsqueda.

Hay algo similar en js, pero la función con los miembros se escribe dentro de la línea de ordenación y se parece más a una simple asignación de parámetros, lo que no lleva al desorden del código. Estoy buscando una variante universal, pero me faltan conocimientos. Tal vez esto se hace a través de algún tipo de punteros o mapeo, por favor ayuda.

En realidad esto es óptimo. Además, permite establecer condiciones de clasificación más complejas.

Por ejemplo:

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

Y, de todas formas, no hay otras soluciones.