![](/imgs/toolMall/wechat.png)
![](https://rrh123-com.oss-cn-hongkong.aliyuncs.com/rrh123/common/images/1715938039514.jpg)
结构体的概念
MQL4编程语言中的结构体(Struct)是一种自定义数据类型,用于组合不同类型的变量成员,以表示一个更复杂的数据结构。它可以包含不同的数据类型,如整数、浮点数、字符、字符串等,并允许我们将这些变量打包在一个单独的实体中。
-
实例:实例是根据结构体定义创建的具体对象。当我们定义一个结构体时,实际上定义了一种数据类型,它描述了结构体的组成成员和布局。然而,只有在我们根据结构体定义创建一个实例时,才会在内存中分配空间来存储该实例的数据。
-
成员变量:成员变量是结构体内部定义的变量,用于存储结构体的数据。它们是结构体的组成部分,表示结构体的特定属性或特征。成员变量可以是不同的数据类型,例如整数、浮点数、字符串等。每个实例都拥有自己独立的一组成员变量,并且可以通过实例来访问和修改这些变量的值。
在(第一单元)第3小节当中,我们讲到了变量的分类,全局变量与局部变量,今天我们接触到的结构体中的“成员变量”,它相对结构体来说是局部变量,因为它只在穿件实例后生效;但是他能通过在全局作用域中创建实例来达到全局变量的效果,也就是可以在程序的任何位置访问它。
-
成员变量初始化:
成员变量的初始化和普通变量没有区别,可以参考之前的文章。
结构体分类
-
单一结构体:只有一个实例的结构体。也就是说,该结构体在内存中只占用了一个实例的空间。单一结构体通常用于表示单个独立的实体或数据对象。例如,一个表示学生的结构体,它只包含一个学生的信息,如姓名、年龄和成绩。
-
复合结构体:拥有多个实例的结构体。复合结构体将多个结构体实例组合在一起,形成一个更复杂的数据结构。这些结构体实例可以相互关联,共同描述一个更大范围的实体或数据集合。例如,一个表示班级的结构体,它包含多个学生的信息,每个学生的信息由一个单独的学生结构体表示。在程序中,您可以创建多个学生结构体实例,并将它们组合成一个班级结构体实例,以便表示整个班级的信息。
在这段代码中,Trade 是结构体的名称。它定义了一个名为 Trade 的结构体,该结构体包含了 int 类型的成员变量 a,double 类型的成员变量 b,以及 string 类型的成员变量 c。然后,通过使用该结构体创建了多个实例。
在这个例子中,有三个实例:
order[ ] 是一个数组:用于存储多个 Trade 结构体的实例。意味着可以创建多个 Trade 类型的对象,并将它们存储在 order 数组中。数组的大小可以根据需要进行定义。
add 是一个单独的 Trade 结构体实例,用于存储和操作 Trade 结构体中定义的成员变量。
mode 是另一个单独的 Trade 结构体实例。它也是通过使用结构体定义创建的一个对象,具有结构体中定义的成员变量。
可能学到这里你会觉得一头雾水,下面我通过一张图来解释复合型结构体的构造。
- 结构体由于关键字struct声明,包含一个名称和另外两个花括号 { }圈定作用域,以分割符结束整个结构体的声明。
- 实例创建部分包含3个独立的实例,每个实例都能够直接操作其成员。
- 重点来了:每个实例都有自己的一组成员变量,并且对一个实例的成员变量的修改不会影响其他实例的对应成员变量的值。每个实例都拥有独立的存储空间,因此它们的成员变量是相对独立的。
结构体的应用
1、声明一个结构体。昨天案例中的数组我们先保留,之后我们还需要用到。
2、继续上一节当中的初始化操作,提前为结构体的使用做准备、
3、调用和赋值成员变量也非常简单,
- ArrayResize(data, 0);:这行代码将 data 数组的大小设置为 0,相当于清空了整个data实例数组中的元素。
- ArrayResize(data, ArraySize(symbol));:这行代码将 data 数组的大小设置为 symbol 数组的大小,实现了将 data 数组的容量克隆为 symbol 数组的大小。
4、用常见的手法再对其余的实例成员变量进行初始化操作。
for(int i=0;i<ArraySize(data);i++):这是一个循环语句,用于遍历 data 数组的每个元素。
data[i].sym = symbol[i];:将 data 数组的第 i 个元素的 sym 成员变量设置为 symbol 数组的第 i 个元素。等同于克隆元素了。
进行一系列赋值操作来填充data实例数组后,我们单独为add实例赋值,注意这里add实例按照其成员变量来计算也只有三个变量。
add.sym = "3X symbol";:将 add 结构体的 sym 成员变量设置为字符串 "3X symbol"。
add.bid += data[i].bid;:累加data[i].bid成员的值。
add.ask += data[i].ask;:累加data[i].ask成员的值。
提示:
在成员数量上是按照其实例类型决定的,数组实例的成员大小=单个成员的大小x成员数量;普通成员的大小=成员数量;通俗了讲你声明数组实例时,有几个成员就有几个数组,每一个成员都是一个独立的数组;同理普通实例有几个成员就有几个变量
5、本章节中我们使用了一组封装的图形对象来输出到图表,相关知识我们后期再延伸。下面来看实现后的效果
本节知识总结
结构体分为单一结构体和复合结构体,结构体可以通过定义不同的实例来达到结构复用,简化代码的目的。
单一结构体或是复合结构体的赋值操作和普通数组、变量基本相似,用xxx.xxx的格式来操作实例对应的成员。