如何在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; // } }
为什么原来的写法会报错?
- 语法错误:MQL4的函数返回值类型不支持
int[]这种数组写法,你写的int GetPrevious[]()是无效的函数声明,这是编译报错的直接原因。 - 内存风险:就算语法允许,你在函数内部声明的局部数组
result[]会在函数执行结束后被自动释放内存,返回它会导致程序访问无效内存,引发运行时崩溃。
如果是在原生C++场景下,类似的问题也可以用同样的思路(传入std::vector&作为参数),或者返回std::vector(它会自动管理内存),但要避免返回原生数组的指针/引用。
内容的提问来源于stack exchange,提问作者Lorry Laurence mcLarry
相关产品推荐
相关产品推荐

