You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MQL4中通过引用将方法输出赋值给变量?含C++类比

解决MQL4(及类似语言)数组返回编译错误的方案

这个编译报错的核心问题在于MQL4不允许函数直接返回数组类型,而且你写的int GetPrevious[]()这种语法本身就不符合MQL4的函数定义规范,再加上局部数组在函数执行完毕后会被销毁,就算语法能过也会引发内存问题。下面给你一套直接可行的修正方案:

核心思路:用引用参数传递结果数组

不要让函数返回数组,而是把需要填充结果的数组作为引用参数传入函数,函数内部直接修改这个数组的内容——这是MQL4处理数组输出的标准方式,也适用于需要手动指定引用传递的类似语言(比如原生C++数组场景)。

修改后的完整代码示例

调用语句调整

// 先声明要接收结果的数组,不需要提前Resize
int[] previous;
// 把结果数组作为第三个参数传入
GetPrevious(i, ZigZagBuffer, previous);

函数定义修正

// 返回值改为void,新增引用参数int& result[]用来存储结果
void GetPrevious(int current, const double& buffer[], int& result[]) {
    int count = 0;
    
    // --- 这里写你的count计算逻辑 ---
    // 比如根据current和buffer的内容计算需要返回的元素数量
    // count = yourCalculationLogic(current, buffer);
    
    // 先清空结果数组的原有内容,再调整到目标大小
    ArrayFree(result);
    ArrayResize(result, count);
    
    // --- 这里写填充result数组的逻辑 ---
    // 比如用循环把计算好的元素赋值给result
    // for(int idx = 0; idx < count; idx++) {
    //     result[idx] = yourElementValue;
    // }
}

为什么原来的写法会报错?

  1. 语法错误:MQL4的函数返回值类型不支持int[]这种数组写法,你写的int GetPrevious[]()是无效的函数声明,这是编译报错的直接原因。
  2. 内存风险:就算语法允许,你在函数内部声明的局部数组result[]会在函数执行结束后被自动释放内存,返回它会导致程序访问无效内存,引发运行时崩溃。

如果是在原生C++场景下,类似的问题也可以用同样的思路(传入std::vector&作为参数),或者返回std::vector(它会自动管理内存),但要避免返回原生数组的指针/引用。

内容的提问来源于stack exchange,提问作者Lorry Laurence mcLarry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:54:39