MT4函数 传递数组

一、基本语法

1. 传递一维数组
  • 函数声明

    cpp

    复制

    void FunctionName(type &arrayName[], ...) // 按引用传递

    cpp

    复制

    void FunctionName(type arrayName[], ...)  // 省略 & 符号,但依然按引用传递
  • 调用函数

    cpp

    复制

    FunctionName(existingArray, ...);
2. 传递多维数组
  • 函数声明
    必须指定除第一维外的其他维度大小:

    cpp

    复制

    void FunctionName(type &arrayName[][2], ...)  // 二维数组,第二维固定为2

二、核心规则

  1. 按引用传递

    • 函数内部修改数组内容会直接影响原始数组。

    • 无需返回数组即可保留修改结果。

  2. 动态数组与静态数组

    • 动态数组(未预定义大小)可自由调整大小(通过 ArrayResize)。

    • 静态数组(预定义大小)作为参数时,需确保函数内不越界访问。

  3. 多维数组限制

    • 除第一维外,其他维度大小必须明确指定。


三、示例代码

示例 1:修改数组内容

cpp

复制

// 定义一个函数,将数组所有元素乘以系数
void MultiplyArray(double &arr[], double factor) {
    for(int i = 0; i < ArraySize(arr); i++) {
        arr[i] *= factor;
    }
}

// 调用示例
void OnStart() {
    double prices[] = {1.0, 2.0, 3.0};
    MultiplyArray(prices, 2.0); // 原始数组变为 {2.0, 4.0, 6.0}
}
示例 2:传递动态数组并调整大小

cpp

复制

// 定义一个函数,向动态数组添加新元素
void AppendToArray(int &arr[], int value) {
    int size = ArraySize(arr);
    ArrayResize(arr, size + 1); // 扩展数组大小
    arr[size] = value;          // 添加新值
}

// 调用示例
void OnStart() {
    int data[];
    AppendToArray(data, 10); // data = {10}
    AppendToArray(data, 20); // data = {10, 20}
}
示例 3:多维数组传递

cpp

复制

// 定义一个函数,打印二维数组内容
void Print2DArray(int &arr[][2]) {
    for(int i = 0; i < ArrayRange(arr, 0); i++) {
        Print("元素 ", i, ": ", arr[i][0], ", ", arr[i][1]);
    }
}

// 调用示例
void OnStart() {
    int matrix[3][2] = {{1, 2}, {3, 4}, {5, 6}};
    Print2DArray(matrix);
}

四、注意事项

  1. 避免越界访问
    在函数内部使用 ArraySize() 或 ArrayRange() 获取数组实际大小,确保索引有效性。

  2. 性能优化
    传递大型数组时,按引用传递不会复制数据,性能高效。

  3. 强制按值传递(变通方法)
    如果需要避免修改原数组,可先复制数组到临时变量:

    cpp

    复制

    void SafeFunction(const double &srcArray[]) {
        double tempArray[];
        ArrayCopy(tempArray, srcArray); // 复制到临时数组
        // 操作 tempArray,原数组不受影响
    }

五、实际应用场景

场景:计算移动平均线(MA)

cpp

复制

// 函数:计算简单移动平均
void CalculateSMA(const double &priceSeries[], int period, double &output[]) {
    int size = ArraySize(priceSeries);
    ArrayResize(output, size - period + 1);
    
    for(int i = 0; i < size - period + 1; i++) {
        double sum = 0.0;
        for(int j = 0; j < period; j++) {
            sum += priceSeries[i + j];
        }
        output[i] = sum / period;
    }
}

// 调用示例
void OnStart() {
    double closePrices[100];
    CopyClose(Symbol(), PERIOD_CURRENT, 0, 100, closePrices);
    
    double maResults[];
    CalculateSMA(closePrices, 14, maResults); // 计算14周期MA
}

六、常见错误

  1. 静态数组越界

    cpp

    复制

    void BadFunction(int arr[5]) {
        arr[5] = 10; // 错误!索引 5 越界(合法索引为0-4)
    }
  2. 未初始化动态数组

    cpp

    复制

    void ProcessArray(int &arr[]) {
        ArrayResize(arr, 10); // 必须确保数组是动态声明的
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值