mql5语言的特点、微妙之处以及技巧 - 页 183

 
Denis Kirichenko:

同事们,如果可能的话,请帮我做一个宏观。

我需要动态地声明一个二维数组。而第二个层面也必须改变。这是类似这样的循环。

当然,编译器会对此表示反对。

我希望看到一个类似以下的宏。

而不是一条线。

谢谢你。

我使用一个结构数组,一切都能正常工作,包括复制

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

唯一的问题是,当你访问字段时,你必须写出字段的名称,但我对此没有意见。

 
如果急需重置EA中的静态变量/数组(包括const),重新登录即可。
 
fxsaber:
如果急需重置EA中的静态变量/数组(包括const),重新登录即可。

如果你需要重置所有的静态变量(包括那些你自己声明为常量的变量),你需要改变项目架构)。当然是IMHO。

 

你能告诉我用什么来代替????,以使其发挥作用吗?谢谢你

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中也有类似的东西,但这个带成员的函数是写在排序行里面的,看起来更像是一个简单的参数分配,不会导致代码杂乱。我正在寻找一个通用的变体,但我缺乏知识。也许它是通过某种指针或映射完成的,请帮助。

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

你能告诉我用什么来代替????,以使其发挥作用吗?谢谢你

你需要告诉该函数用于检查数组的类成员 的名称。

论坛上已经发布了一个通用的解决方案。你将不得不去寻找它。

 
fxsaber:

一个一刀切的解决方案被贴在论坛上。你需要查一查。

你是否碰巧记得,至少是哪一节?这就像在干草堆里找一根针)。
 
Georgiy Liashchenko:
你是否碰巧记得,至少是哪一节?这就像在干草堆里找一根针)。

我只记得那是两个月前。

 
Georgiy Liashchenko:

谢谢,这是个有趣的选择。但这并不是我所寻找的。如果我对代码的理解是正确的,你正在向右手边传递一个排序函数,但你已经在其中规定了结构成员。这意味着,如果我需要用另一个成员或另一个对象的名字来排序,我将不得不为每种情况创建一个单独的函数。不幸的是,这并不十分乐观。但它可能是)我继续我的搜索。

js中也有类似的东西,但带成员的函数是写在排序行里面的,看起来更像是一个简单的参数赋值,不会导致代码杂乱。我正在寻找一个通用的变体,但我缺乏知识。也许这是通过某种指针或映射完成的,请帮助。

事实上,这是最佳状态。而且它允许你设置更复杂的排序条件。

比如说。

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

而且反正也没有其他解决办法。