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,数组的合法索引范围是0到1。这时候给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




