Características da linguagem mql5, subtilezas e técnicas - página 183

 
Denis Kirichenko:

Colegas, por favor ajudem-me a fazer uma macro, se de todo possível.

Preciso de declarar dinamicamente uma matriz bidimensional. E a segunda dimensão também deve ser alterada. Isto é algo parecido com este laço:

É claro que o compilador não vai conseguir fazer isso:

Gostaria de ver uma macro como a seguinte:

Em vez de uma linha:

Obrigado.

Utilizo um conjunto de estruturas e tudo funciona, incluindo a cópia

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

A única coisa é que é preciso escrever os nomes dos campos quando se acede a eles, mas estou bem com isso

 
Se houver uma necessidade urgente de reiniciar variáveis/arrays estáticas (incluindo const) em EAs, é suficiente um re-login.
 
fxsaber:
Se houver uma necessidade urgente de reiniciar variáveis/arrays estáticas (incluindo const) em EAs, é suficiente um re-login.

Se precisar de repor TODAS as variáveis estáticas (incluindo aquelas que você mesmo declarou como constantes), precisa de alterar a arquitectura do projecto). IMHO, claro.

 

Pode dizer-me o que devo especificar em vez de ???? para que funcione? Obrigado

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

É necessário dizer à função o nome do membro da classe para verificar a matriz com

 
Georgiy Liashchenko:

Pode dizer-me o que devo especificar em vez de ???? para que funcione? Obrigado

Preciso de uma forma de dizer à função o nome do membro da classe através do qual verificar a matriz

Esta opção:

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:

Uma tal opção:

Obrigado, essa é uma opção interessante. Mas não é bem o que procuro. Se entendi correctamente o código, passa uma função de ordenação para o lado direito, mas já escreve nele os membros da estrutura. Isto significa que, se precisar de ordenar por outro membro ou outro objecto com o nome de outro membro, terei de criar uma função separada para cada caso. Infelizmente, não é muito optimista. Mas talvez seja) Continuo a minha pesquisa.

Há algo semelhante em js, mas esta função com membros está escrita dentro da linha de classificação e parece mais uma simples atribuição de parâmetros, o que não leva a uma desordem de códigos. Estou à procura de uma variante universal, mas falta-me conhecimento. Talvez seja feito através de algum tipo de apontadores ou mapeamento, por favor ajude.

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

Pode dizer-me o que devo especificar em vez de ???? para que funcione? Obrigado

É necessário dizer à função o nome do membro da classe a ser utilizado para verificar a matriz.

Uma solução universal foi colocada no fórum. Terá de o procurar.

 
fxsaber:

Uma solução de tamanho único foi colocada no fórum. É preciso pesquisar.

Por acaso lembra-se de que secção, pelo menos? É como procurar uma agulha num palheiro).
 
Georgiy Liashchenko:
Por acaso lembra-se de que secção, pelo menos? É como procurar uma agulha num palheiro).

Só me lembro de que foi há dois meses atrás.

 
Georgiy Liashchenko:

Obrigado, é uma opção interessante. Mas não é bem o que procuro. Se entendi o código correctamente, passa uma função de ordenação para o lado direito, mas nela já prescreve os membros da estrutura. Isto significa que, se precisar de ordenar por outro membro ou outro objecto com o nome de outro membro, terei de criar uma função separada para cada caso. Infelizmente, não é muito optimista. Mas talvez seja) Continuo a minha pesquisa.

Há algo semelhante em js, mas esta função com membros está escrita dentro da linha de classificação e parece mais uma simples atribuição de parâmetros, o que não leva a uma desordem de códigos. Estou à procura de uma variante universal, mas falta-me conhecimento. Talvez isto seja feito através de algum tipo de indicações ou mapeamento, por favor ajude.

Na verdade, isto é óptimo. E permite estabelecer condições de triagem mais complexas.

Por exemplo:

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 não há outras soluções de qualquer forma.