MQL5 迭代结构
MQL5 iterate over struct
是否可以遍历结构的两个维度?更具体地说,我想知道是否可以迭代结构的列,例如:
struct Struct { string NAME; int WERT; double VALUE; datetime TIME; int INT; string TYPE; };
Struct s[];
string cols[]={"NAME","WERT","VALUE","TIME","INT","TYPE" };
s[0].NAME = "B";
s[0].WERT = 10;
s[0].VALUE= 50.00;
s[0].TIME = TimeCurrent();
s[0].INT=5;
s[0].TYPE="Man";
s[1].NAME = "A";
s[1].WERT = 10000;
s[1].VALUE= 40000.00;
s[1].TIME = TimeCurrent();
s[1].INT=100;
s[1].TYPE="female";
for(int i=0; i<3; i++)
{
for(int j=0; j<=ArraySize(cols); j++)
{
s[i].cols[j]; // <-------------------
}
}
欢迎来到 SOF!
首先,最好避免在struct
中使用复杂的结构,例如string
。如果您希望您的结构具有 string
值,请使用 class
'es。如果确实需要 string
,请使用 char[]
并进行转换。
其次,您无法知道 struct
中有多少元素,也无法对其进行迭代 - 没有反射,抱歉。如果我是你,我会将你的 TYPE
转换为 bool
(enum
以防 "male" 和 "female" 不够 :) 并有一个 array
的 long
(包括 int
、bool
、datetime
和任何其他整数类型)和 double
(添加 float
在里面)然后迭代这两个 array
的大小。
您实际上可以使用 JAson
库来实现此类行为。 linky
示例:
#include <jason.mqh>
void OnStart()
{
CJAVal s;
s[0]["NAME"] = "B";
s[0]["WERT"] = 10;
s[0]["VALUE"]= 50.00;
s[0]["TIME"] = (int)TimeCurrent();
s[0]["INT"]=5;
s[0]["TYPE"]="Man";
s[1]["NAME"] = "A";
s[1]["WERT"] = 10000;
s[1]["VALUE"]= 40000.00;
s[1]["TIME"] = (int)TimeCurrent();
s[1]["INT"]=100;
s[1]["TYPE"]="female";
Print(s.Serialize());
for(int i=0; i<s.Size(); i++) {
for(int j=0; j<s[i].Size(); j++) {
string key = s[i].m_e[j].m_key;
printf("%s = string(%s), int(%d), double(%.3f)",
key,
s[i][key].ToStr(),
s[i][key].ToInt(),
s[i][key].ToDbl()
);
}
}
}
尽管如此,您最好在 structs
和 classes
上创建一个 to_string
方法
struct Struct {
string name;
int wert;
double value;
string str() {
return StringFormat("Struct(%s, %d, %.2f)", name, wert, value);
}
};
是否可以遍历结构的两个维度?更具体地说,我想知道是否可以迭代结构的列,例如:
struct Struct { string NAME; int WERT; double VALUE; datetime TIME; int INT; string TYPE; };
Struct s[];
string cols[]={"NAME","WERT","VALUE","TIME","INT","TYPE" };
s[0].NAME = "B";
s[0].WERT = 10;
s[0].VALUE= 50.00;
s[0].TIME = TimeCurrent();
s[0].INT=5;
s[0].TYPE="Man";
s[1].NAME = "A";
s[1].WERT = 10000;
s[1].VALUE= 40000.00;
s[1].TIME = TimeCurrent();
s[1].INT=100;
s[1].TYPE="female";
for(int i=0; i<3; i++)
{
for(int j=0; j<=ArraySize(cols); j++)
{
s[i].cols[j]; // <-------------------
}
}
欢迎来到 SOF!
首先,最好避免在struct
中使用复杂的结构,例如string
。如果您希望您的结构具有 string
值,请使用 class
'es。如果确实需要 string
,请使用 char[]
并进行转换。
其次,您无法知道 struct
中有多少元素,也无法对其进行迭代 - 没有反射,抱歉。如果我是你,我会将你的 TYPE
转换为 bool
(enum
以防 "male" 和 "female" 不够 :) 并有一个 array
的 long
(包括 int
、bool
、datetime
和任何其他整数类型)和 double
(添加 float
在里面)然后迭代这两个 array
的大小。
您实际上可以使用 JAson
库来实现此类行为。 linky
示例:
#include <jason.mqh>
void OnStart()
{
CJAVal s;
s[0]["NAME"] = "B";
s[0]["WERT"] = 10;
s[0]["VALUE"]= 50.00;
s[0]["TIME"] = (int)TimeCurrent();
s[0]["INT"]=5;
s[0]["TYPE"]="Man";
s[1]["NAME"] = "A";
s[1]["WERT"] = 10000;
s[1]["VALUE"]= 40000.00;
s[1]["TIME"] = (int)TimeCurrent();
s[1]["INT"]=100;
s[1]["TYPE"]="female";
Print(s.Serialize());
for(int i=0; i<s.Size(); i++) {
for(int j=0; j<s[i].Size(); j++) {
string key = s[i].m_e[j].m_key;
printf("%s = string(%s), int(%d), double(%.3f)",
key,
s[i][key].ToStr(),
s[i][key].ToInt(),
s[i][key].ToDbl()
);
}
}
}
尽管如此,您最好在 structs
和 classes
to_string
方法
struct Struct {
string name;
int wert;
double value;
string str() {
return StringFormat("Struct(%s, %d, %.2f)", name, wert, value);
}
};