Caractéristiques du langage mql5, subtilités et techniques - page 183

 
Denis Kirichenko:

Chers collègues, aidez-moi à réaliser une macro, si possible.

Je dois déclarer dynamiquement un tableau à deux dimensions. Et la deuxième dimension doit également être modifiée. C'est quelque chose comme cette boucle :

Bien sûr, le compilateur sera réticent à cette idée :

J'aimerais voir une macro comme la suivante :

Au lieu d'une ligne :

Merci.

J'utilise un tableau de structure et tout fonctionne, y compris la copie.

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

Le seul problème est que vous devez écrire le nom des champs lorsque vous y accédez, mais cela ne me pose aucun problème.

 
S'il y a un besoin urgent de réinitialiser des variables/réseaux statiques (y compris const) dans les EA, une nouvelle connexion est suffisante.
 
fxsaber:
S'il y a un besoin urgent de réinitialiser des variables/réseaux statiques (y compris const) dans les EA, une nouvelle connexion est suffisante.

Si vous devez réinitialiser TOUTES les variables statiques (y compris celles que vous avez vous-même déclarées comme constantes), vous devez modifier l'architecture du projet). IMHO bien sûr.

 

Pouvez-vous me dire ce qu'il faut spécifier à la place de ? ??? pour que cela fonctionne ? Merci.

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

Vous devez indiquer à la fonction le nom du membre de la classe avec lequel vous voulez vérifier le tableau.

 
Georgiy Liashchenko:

Pouvez-vous me dire ce qu'il faut spécifier à la place de ? ??? pour que cela fonctionne ? Merci.

J'ai besoin d'un moyen d'indiquer à la fonction le nom du membre de la classe par lequel vérifier le tableau.

Cette 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:

Une telle option :

Merci, c'est une option intéressante. Mais ce n'est pas tout à fait ce que je recherche. Si j'ai bien compris le code, vous passez une fonction de tri à la partie droite, mais vous y écrivez déjà les membres de la structure. Cela signifie que si j'ai besoin de trier par un autre membre ou un autre objet portant le nom d'un autre membre, je devrai créer une fonction distincte pour chaque cas. Malheureusement, ce n'est pas très optimiste. Mais ça peut l'être) je continue ma recherche.

Il existe quelque chose de similaire en js, mais cette fonction avec des membres est écrite à l'intérieur de la ligne de tri et ressemble davantage à une simple affectation de paramètres, ce qui n'entraîne pas d'encombrement du code. Je cherche une variante universelle, mais je manque de connaissances. Peut-être que cela se fait par le biais d'une sorte de pointeurs ou de mappage, aidez-moi s'il vous plaît.

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

Pouvez-vous me dire ce qu'il faut spécifier à la place de ? ??? pour que cela fonctionne ? Merci.

Vous devez indiquer à la fonction le nom du membre de la classe à utiliser pour vérifier le tableau.

Une solution universelle a été postée sur le forum. Vous devrez le chercher.

 
fxsaber:

Une solution unique a été affichée sur le forum. Vous devez vérifier.

Vous souvenez-vous au moins de quelle section ? C'est comme chercher une aiguille dans une botte de foin).
 
Georgiy Liashchenko:
Vous souvenez-vous au moins de quelle section ? C'est comme chercher une aiguille dans une botte de foin).

Tout ce dont je me souviens, c'est que c'était il y a deux mois.

 
Georgiy Liashchenko:

Merci, c'est une option intéressante. Mais ce n'est pas tout à fait ce que je recherche. Si j'ai bien compris le code, vous passez une fonction de tri à la partie droite, mais dans celle-ci vous prescrivez déjà les membres de la structure. Cela signifie que si j'ai besoin de trier par un autre membre ou un autre objet portant le nom d'un autre membre, je devrai créer une fonction distincte pour chaque cas. Malheureusement, ce n'est pas très optimiste. Mais ça peut l'être) je continue ma recherche.

Il existe quelque chose de similaire en js, mais cette fonction avec des membres est écrite à l'intérieur de la ligne de tri et ressemble davantage à une simple affectation de paramètres, ce qui n'entraîne pas d'encombrement du code. Je cherche une variante universelle, mais je manque de connaissances. Peut-être que cela se fait par le biais d'une sorte de pointeurs ou de mappage, aidez-moi s'il vous plaît.

En fait, c'est optimal. Et il vous permet de définir des conditions de tri plus complexes.

Par exemple :

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

Et il n'y a pas d'autres solutions de toute façon.