如何在 MQL 中分配指向结构数组的指针



我有 3 个相同类型的结构体的独立数组,例如:

MqlTradeRequest orders1[];
MqlTradeRequest orders2[];
MqlTradeRequest orders3[];

与此处对 C 的描述类似。

假设稍后填充这些数组,我如何创建指向其中一个数组的公共指针?


所以我可以做这样的事情:orders_ptr = &orders1*orders_ptr = orders1.

这是我的非工作代码:

MqlTradeRequest orders1[];
MqlTradeRequest orders2[];
MqlTradeRequest orders3[];
enum ORDERS_POOL {
  POOL1,
  POOL2,
  POOL3
};
void start(ORDERS_POOL _pool = POOL1) {
  MqlTradeRequest (*orders_ptr)[]; // Error: Invalid operation use.
  switch (_pool) {
    case POOL1: orders_ptr = &orders1; break; // Error: Invalid array access, class type expected.
    case POOL2: orders_ptr = &orders2; break; // Error: Invalid array access, class type expected.
    case POOL3: orders_ptr = &orders2; break; // Error: Invalid array access, class type expected.
  }
  for (int i = 0; i < ArraySize(orders_ptr); i++) {
    Print(orders_ptr[i].order);
  }
};

这是另一个尝试:

  MqlTradeRequest *orders_ptr; // Error: Invalid operation use.
  switch (_pool) {
    case POOL1: *orders_ptr = GetPointer(orders1); break; // Error: Object pointer expected.
    case POOL2: *orders_ptr = GetPointer(orders2); break; // Error: Object pointer expected.
    case POOL3: *orders_ptr = GetPointer(orders2); break; // Error: Object pointer expected.
  }

通过不同的池,我的意思类似于它在 OrderSelect 中使用其池参数完成的操作,但我的完全不同。

但是上面的代码失败了很多错误,没有任何意义,我已经在注释中包含其中一些错误。

什么是正确的方法?

我的目标是分配一个指向结构数组的指针,以便我可以遍历选定的数组。

在我看来

,您无法在 MQL5 中做到这一点。
对于动态对象,只能像类一样使用指针,对于结构,它是静态指针,与数组或基元相同,MqlRates是结构而不是类。
如果您真的需要这样的魔力 - 创建包含 Mql 结构数组的类。

根据 MQL 支持团队的回复,无法创建指向结构类型对象的指针,也无法获取指向数组的指针。

相反,建议将 MqlTradeRequest 数组包装到类对象(例如 CTradeReqArray),然后可以选择所需的数组并获取指向 CTradeReqArray 对象的指针,正如 Daniel 的答案中所建议的那样。

你可以像这样使用指向同一类对象的指针数组(在使用本机 ArrayObj 时具有优势) - 当然,在类元素中,如果你真的需要,你可以封装你的数组):

//+------------------------------------------------------------------+
//|                                               test_myArrPtrs.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#include <ArraysArrayObj.mqh>
class elD  : public CObject
{  
public:    
   double m_name;
   int m_id;  
        
    elD(){};   //Constructor     
};
CArrayObj  arrD;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
    elD *el=new elD();
    el.m_name = 1.4000;
    el.m_id = 100;
    arrD.CreateElement(0);
    arrD.Add(el);
    elD *e=arrD.At(0);
    Print(e.m_id);
   arrD.Delete(0);
   
   // only dynamic objects should be deleted
   // if you try to delete a static object then you will obviously get errors. The correct way to delete an object is as follows. 
   if (CheckPointer(el) == POINTER_DYNAMIC)
      delete el;
   if (CheckPointer(e) == POINTER_DYNAMIC)
      delete e;
    return;
  }
//+------------------------------------------------------------------+

最新更新