4. 调用DLL中的数组处理函数

任务目标

在DLL中实现一个数组排序函数(升序),CAPL侧定义数组并调用该DLL函数,传入数组及其长度,函数内部完成排序后通过指针直接修改原数组,CAPL获取排序结果并输出验证。

环境与依赖

  • 开发工具:Visual Studio(C++,配置DLL导出)、CANoe(CAPL编译器)
  • DLL位数必须与CANoe一致(32位/64位)
  • CAPL通过extern void SortArray(long arr[], long size);声明导入

DLL端实现(C++)


// SortArrayDll.cpp
#include <windows.h>

extern "C" __declspec(dllexport) void SortArray(long* arr, long size) {
    for (long i = 0; i < size - 1; i++) {
        for (long j = 0; j < size - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                long temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

编译生成 SortArrayDll.dll,并放置到CANoe可访问路径(如CANoe安装目录\Exec32或工程目录)。

CAPL调用代码


/* CAPL脚本 */
extern void SortArray(long arr[], long size);  // DLL函数声明

on start {
    long data[5] = {34, 7, 23, 32, 5};
    long i;
    
    write("排序前: ");
    for (i = 0; i < 5; i++) write("%ld ", data[i]);
    write("");
    
    SortArray(data, 5);   // 调用DLL排序
    
    write("排序后: ");
    for (i = 0; i < 5; i++) write("%ld ", data[i]);
    write("");
}

运行与验证

  1. 在CANoe中新建工程,添加上述CAPL节点。
  2. 在CAPL浏览器中确认DLL函数声明无误,编译通过。
  3. 点击Start运行仿真,观察Write窗口输出。

通过条件:Write窗口显示排序前数组为 34 7 23 32 5,排序后为 5 7 23 32 34,且无错误信息。

常见问题

  • DLL加载失败:检查DLL位数是否与CANoe一致,路径是否正确。
  • 数组长度不匹配:CAPL传入的size必须与实际数组元素个数一致,否则越界。
  • 数据类型对应:CAPL的long为32位有符号整数,对应C++的long(Windows平台同为32位)。