MQL4如何获取三维数组单维度所有值 解决数组越界报错
多维数组单维度值检索实现及越界错误排查
报错核心原因
数组越界由两个典型使用错误导致:
- 对
ArraySize()函数的作用认知偏差:在MQL运行环境中,多维数组调用ArraySize()仅返回*第0维(最靠前的维度)*的元素总数,如果你实际的数组维度顺序和预期不符,或者动态维度实际长度和预设值不一致,直接用这个返回值做循环边界必然出错。 - 硬编码下标未做合法性校验:代码中写死的第二维下标
Arr_ObjectTRUEPRICE、第三维下标0,没有提前确认是否落在对应静态维度的合法下标区间内,任意一个值超出维度长度上限都会触发越界报错。
正确实现代码
不要直接用ArraySize()获取维度长度,统一用ArrayRange(数组名, 维度序号)获取指定维度的实际元素数,维度序号从0开始计数。遍历单维度所有值的代码如下:
// 获取第0维(存放动态索引的维度)的实际长度 int index_dim_size = ArrayRange(AllLetterPrices, 0); // 倒序遍历所有动态索引位 for(int i = index_dim_size - 1; i >= 0; i--) { Print(AllLetterPrices[i, Arr_ObjectTRUEPRICE, 0]); }
越界问题排查清单
按顺序核对以下几点即可定位问题:
- 核对数组声明语句:确认定义数组时动态维度确实放在第0位,结构和描述的
AllLetterPrices[动态索引, 静态标识位, 固定位]一致,不要把静态维度写在靠前位置、动态维度挪到后面。 - 核对静态维度下标范围:按照给出的结构,两个静态维度的可用下标是0、1(第二维)和0(第三维),先打印
ArrayRange(AllLetterPrices,1)和ArrayRange(AllLetterPrices,2)确认实际长度,确保Arr_ObjectTRUEPRICE的值小于第二维长度、0小于第三维长度——比如第二维长度是2的话,Arr_ObjectTRUEPRICE只能是0或1,赋值为2就会越界。 - 核对动态维度初始化状态:如果数组声明后没有调用
ArrayResize(AllLetterPrices, 目标长度)给动态维度分配空间,直接访问元素也会报越界。 - 如果给数组调用过
ArraySetAsSeries设置时序属性,不影响ArrayRange的返回结果,只要按上述方法取维度长度就不会出现边界错误。
内容的提问来源于stack exchange,提问作者Jesse Arnold
相关产品推荐
相关产品推荐

