如何在 MQL 中分配指向结构数组的指针?
How to assign a pointer to the array of struct in MQL?
我有 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 参数所做的类似,但我的池完全不同。
但是上面的代码失败了,有很多没有任何意义的错误,我在评论中包含了其中的一些错误。
什么是正确的方法?
我的目标是分配一个指向struct数组的指针,这样我就可以遍历选中的数组。
在我看来你不能在 MQL5 中做到这一点。
你只能像 classes 那样对动态对象使用指针,对于结构它是一个静态指针,与数组或基元一样, MqlRates
是一个结构,而不是 class。
如果你真的需要这样的魔法 - 创建 classes 里面有一个 Mql-structures 的数组。
根据 MQL 支持团队的回复,无法创建指向结构类型对象的指针,也无法获取指向数组的指针。
相反,建议将 MqlTradeRequest 数组包装到 class 对象(例如 CTradeReqArray),然后可以选择所需的数组并获取指向 CTradeReqArray 对象的指针,如 .
您可以像这样使用指向相同 class 对象的指针数组(在使用本机 ArrayObj 时具有优势)- 当然,在 class 元素中您可以封装数组,如果你真的需要):
//+------------------------------------------------------------------+
//| 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;
}
//+------------------------------------------------------------------+
我有 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 参数所做的类似,但我的池完全不同。
但是上面的代码失败了,有很多没有任何意义的错误,我在评论中包含了其中的一些错误。
什么是正确的方法?
我的目标是分配一个指向struct数组的指针,这样我就可以遍历选中的数组。
在我看来你不能在 MQL5 中做到这一点。
你只能像 classes 那样对动态对象使用指针,对于结构它是一个静态指针,与数组或基元一样, MqlRates
是一个结构,而不是 class。
如果你真的需要这样的魔法 - 创建 classes 里面有一个 Mql-structures 的数组。
根据 MQL 支持团队的回复,无法创建指向结构类型对象的指针,也无法获取指向数组的指针。
相反,建议将 MqlTradeRequest 数组包装到 class 对象(例如 CTradeReqArray),然后可以选择所需的数组并获取指向 CTradeReqArray 对象的指针,如
您可以像这样使用指向相同 class 对象的指针数组(在使用本机 ArrayObj 时具有优势)- 当然,在 class 元素中您可以封装数组,如果你真的需要):
//+------------------------------------------------------------------+
//| 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;
}
//+------------------------------------------------------------------+