You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MQL5动态数组存储异常求助:未调用ArrayResize()触发越界错误

MQL5数组越界问题分析与解决

我来帮你拆解这个MQL5数组的问题——其实这完全是MQL5数组的初始化机制导致的,咱们一步步理清楚:

为什么未调用ArrayResize()会触发越界错误?

在MQL5里,如果你只做了数组声明double d [];,这个时候数组并没有被分配实际的内存空间,它的长度是0(你可以用ArraySize(d)验证,返回结果肯定是0)。这时候直接给d[0]赋值,相当于访问了一个不存在的内存位置,自然就会抛出array out of range的错误。你贴的报错信息也精准指向了赋值的行号,完全符合这个逻辑。

调用ArrayResize()后为什么能正常运行?

当你执行ArrayResize(d,2);时,MQL5会为数组d分配能容纳2个double类型元素的内存空间,此时ArraySize(d)返回2,数组的合法索引范围是01。这时候给d[0]赋值是完全合法的,后续遍历数组时,第一个元素是你赋值的1,第二个元素因为没手动初始化,会输出MQL5默认填充的0.0(数值型数组未初始化元素默认值为0)。

补充:更便捷的动态数组操作方式

如果你需要动态添加元素,不用每次手动调用ArrayResize(),MQL5提供了ArrayPushBack()函数,能自动扩容数组并添加元素,用法如下:

double d[];
// 动态添加第一个元素
ArrayPushBack(d, 1);
// 动态添加第二个元素
ArrayPushBack(d, 2.5);
// 遍历打印所有元素
for(int i = 0; i < ArraySize(d); i++){
    Print(d[i]);
}

这样代码会更简洁,也能避免手动计算数组大小的失误。


内容的提问来源于stack exchange,提问作者Jaffer Wilson

火山引擎 最新活动