来自一个 "傻瓜 "的问题 - 页 123

 
papaklass:

MqlRates mrate[];//массив нулевого размера

使用ArrayResize和ArrayInitialize

通常使用CopyRates这个结构

 
papaklass:

雷纳特说这样做比较好。

MqlRates mrate[] = {0};    //структура для хранения информации о ценах, объемах и спреде.

让我们试着去弄清楚。在我印象中,Renat说的是初始化一个简单的变量,而不是一个数组。与战斗类似的例子出现在《参考手册》中。

//--- инициализация всех полей структуры нулевым значением
MqlTradeRequest request={0};

另一方面,你在声明时,试图初始化一个数组而不是一个简单的变量。我在《手册》中发现了这个例子。

double f[]     = { 0.0, 0.236, 0.382, 0.5, 0.618, 1.0 };

Если размер инициализируемого массива не указан, то он 
определяется компилятором, исходя из размера инициализирующей последовательности.

这里的数组是用有限的数值初始化的,解释说编译器是依靠这些数值的数量来决定这样一个数组的大小。我懒得去检查--例子中数组f[]的大小很可能是6。

在你的样本中,{0}初始化序列的 大小为1。因此,编译器很可能将数组mrate[]的大小定义为1。在这里,为了方便起见,这样说明。

MqlRates mrate[] = {0,0,0,0,0,0,0,0,0,0,0,0};    //структура для хранения информации о ценах, объемах и спреде.
会不会造成错误?
 
papaklass:
我感到很困惑。斯万清楚地解释了这一点。我采取了错误的结构。它根本不需要被初始化,因为它取值。你需要初始化那些给出它们的值的。我错了。

嗯,这是最主要的事情。 关于雷娜特的问题本身就很有趣,所以我也想明白了一些事情。

 

double f[] = { 0.0, 0.236, 0.382, 0.5, 0.618, 1.0 }; 不是动态阵列

Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
220Volt:

double f[] = { 0.0, 0.236, 0.382, 0.5, 0.618, 1.0 }; 非动态阵列。

double f[]本身就是一个动态数组。在创建过程中,正是这个数组被声明。我还没有分析用有限初始化序列 初始化后是否会停止动态。你在上面发现的主要情况是,声明的数组在初始化后获得了一个特定的大小。

你是说显式初始化的结果中的动态数组不再是动态的,即失去其动态状态和属性?- 也许是这样,但我很怀疑。 问题:基于什么理由(为什么)动态数组 double f[] 不再是一个动态数组?

 
Yedelkin:

double f[]本身就是一个动态数组。它是在创造时宣布的。我没有调查过它是否在被最后的初始化序列 初始化后就不再是动态的。你在上面发现的主要情况是,声明的数组在初始化后获得了一个特定的大小。

你是说显式初始化的结果中的动态数组不再是动态的,即失去其动态状态和属性?- 也许是这样,那么问题是:为什么?

整个问题的关键是,我们MKL与现实世界有点 "隔绝"),在这种情况下,编译器为我们决定。如果它看到它。

double f[5];
double f[] = {0, 1, 3};

创建一个静态数组(没有调整大小的能力)。如果它看到它。

double f[];

在全局内存中创建结构体MqlArrayObject(它表现为一个动态数组)。因此,你不能在声明后初始化一个数组 (double f[]; f = {6};)

P.S:所有写的都是我的IMHO,我可能在某个地方错了。

 

一个傻瓜的问题:如果编译器看到字符串

double f[] = {0, 1, 3};

它最初会创建一个静态数组而不是动态数组?

有一条规则:"当声明一个动态数组(在第一对方括号里有一个未指定的值数组)时,编译器会自动创建一个结构 变量MqlArrayObject(一个动态数组对象)并提供正确的初始化代码。还是最终初始化序列 的存在等于 "明确指定了所有重要的数组尺寸",并导致创建一个静态数组?

 
Yedelkin:

一个傻瓜的问题: 如果编译器看到字符串

它最初会创建一个静态数组而不是动态数组?

有一条规则:"当声明一个动态数组(在第一对方括号里有一个未指定的值数组)时,编译器会自动创建一个结构 变量MqlArrayObject(一个动态数组对象)并提供正确的初始化代码。还是最终初始化序列 的存在等于 "明确指定了所有重要的数组尺寸",并导致创建一个静态数组?

检查它是否很弱?

;)

 
MetaDriver:

你不觉得你应该检查一下吗?

;)

目前不多。我今天晚上才会到终点站。否则我对220V电压的回答会听起来不一样,你可以理解 :)我在《手册》中找不到这些信息。也许我看得不够仔细,但一丝不苟。
 
Yedelkin:
目前,它很弱。我今天晚上才会到终点站。否则我对220V电压的回答听起来就不一样了,你懂的 :)我在《手册》中找不到这些信息。也许我看得不够仔细,但我是一丝不苟。

好了,我已经离开了终端。:) 我也在航站楼外。

检查过的元素 - 试图使用ArrayResize(...)。

Документация по MQL5: Операции с массивами / ArrayResize
Документация по MQL5: Операции с массивами / ArrayResize
  • www.mql5.com
Операции с массивами / ArrayResize - Документация по MQL5