Особенности языка mql5, тонкости и приёмы работы - страница 183

 
Denis Kirichenko:

Коллеги, прошу помочь составить макрос, если это вообще возможно.

Нужно динамически объявлять двумерный массив. Причём второе измерение тоже нужно менять. Вот примерно в таком цикле:

Ест-но, что в таком варианте компилятор ругается: 

Хотелось бы видеть макрос похожий на:

Вместо строчки:

Спасибо.

я массивом структур пользуюсь, работает все, включая копирование

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

единственное писать имена полей приходится при обращении, но меня устраивает

 
Если нужно срочно сбросить статические переменные/массивы (включая const) в советниках, достаточно сделать релогин.
 
fxsaber:
Если нужно срочно сбросить статические переменные/массивы (включая const) в советниках, достаточно сделать релогин.

Если появилась необходимость сбросить ВСЕ статические переменные (включая те которые сам константными объявил), то надо архитектуру проекта менять). ИМХО конечно.

 

Подскажите что нужно указать вместо ???? чтобы работало. Спасибо

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

Требуется както сообщить функции имя члена класса по которому будет проверка массива

 
Georgiy Liashchenko:

Подскажите что нужно указать вместо ???? чтобы работало. Спасибо

Требуется както сообщить функции имя члена класса по которому будет проверка массива

Такой вариант:

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:

Такой вариант:

Спасибо, интересный вариант. Однако не совсем то, что я ищу. Если я правильно понял код, то вы передаете празу сортировочную функцию, но в ней уже прописываете члены структуры. Тоесть если мне нужно будет сортировать по другому члену или другой обьект с другим названием члена, то под каждый случай нужно создавать отдельную функцию. К сожалению это не очень оптимально. Однако имеет место быть) Продолжаю поиски

Что-то похожее есть в js но там эта функция с членами прописывается сразу в строке  sort и больше похоже на просто задаваемые параметры , что не приводит к нагромождению кода. Я же ищу универсальный вариант, но знаний не хватает. Возможно это через какието указатели или маппинг делается, плиз хелп

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

Подскажите что нужно указать вместо ???? чтобы работало. Спасибо

Требуется както сообщить функции имя члена класса по которому будет проверка массива

На форуме выкладывали универсальное решение. Нужно искать.

 
fxsaber:

На форуме выкладывали универсальное решение. Нужно искать.

Случайно не помните в каком разделе хотя бы? А то так искать как иголку в стоге сена)
 
Georgiy Liashchenko:
Случайно не помните в каком разделе хотя бы? А то так искать как иголку в стоге сена)

Помню только, что месяца два назад было.

 
Georgiy Liashchenko:

Спасибо, интересный вариант. Однако не совсем то, что я ищу. Если я правильно понял код, то вы передаете празу сортировочную функцию, но в ней уже прописываете члены структуры. Тоесть если мне нужно будет сортировать по другому члену или другой обьект с другим названием члена, то под каждый случай нужно создавать отдельную функцию. К сожалению это не очень оптимально. Однако имеет место быть) Продолжаю поиски

Что-то похожее есть в js но там эта функция с членами прописывается сразу в строке  sort и больше похоже на просто задаваемые параметры , что не приводит к нагромождению кода. Я же ищу универсальный вариант, но знаний не хватает. Возможно это через какието указатели или маппинг делается, плиз хелп

Вообще-то это оптимально. И позволяет задать более сложные условия сортировки.

Например:

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

Да и других решений всё равно нет.

Причина обращения: