【问题标题】:How to assign a pointer to the array of struct in MQL?如何在 MQL 中分配指向结构数组的指针?
【发布时间】:2023-04-03 04:04:01
【问题描述】:

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

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

for C in here描述的类似。

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


所以我可以这样做: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 中的 pool 参数类似的东西,但我的池完全不同。

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

什么是正确的方法?

我的目标是分配一个指向struct数组的指针,这样我就可以遍历选中的数组了。

【问题讨论】:

  • [out-of-record ] 你最近的问题似乎确实是对 New-MQL4/5 语法内部边界的创造性折磨测试。祝狩猎顺利!总是鼓舞人心,伙计 +1!

标签: pointers struct compiler-errors mql5


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您可以像这样使用指向同一类对象的指针数组(在使用本机 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 <Arrays\ArrayObj.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;
        }
      //+------------------------------------------------------------------+
      

      【讨论】:

        猜你喜欢
        • 2021-12-14
        • 1970-01-01
        • 2013-03-02
        • 1970-01-01
        • 2015-04-16
        • 1970-01-01
        • 2011-02-01
        • 2018-05-16
        • 2017-06-03
        相关资源
        最近更新 更多