【CAPL】自定义函数的四种类型
定义函数中涉及到的重要概念
定义函数
- 函数声明
- 函数声明中:返回值类型 函数名(参数列表){}
- 函数体:coding; return 返回值;
调用函数
- 形参:函数声明的函数列表中的变量
- 实参:调用函数时,实际传入的变量
提前小结
-
CAPL的自定义函数与其他语言的自定义函数类似
-
场景较为特殊,需要考虑车载开发、总线信号传递等
-
具体参考c语言的自定义函数
CAPL自定义函数与c语言的差异点
-
(1)返回值类型可省略
- 当返回值类型省略时,被默认解释为void类型。
-
(2)允许空形参
- 正如C++一样,允许函数包含一个空的形参列表。
-
(3)允许重载函数
- 即同一个函数名,但每个函数的形参列表必须不同
- 例如,不同的形参类型或者在形参列表中的不同次序
- 例如: CANoe函数库所带函数toUpper,其功能是将字符或字符串转换为大写字母。函数原型如下。
![图片]()
-
(4)函数会对实参进行类型检查和隐式匹配
- 如果类型不同则检查是否能够通过隐式类型转换,如不能,则无法通过编译
- 例如:
![图片]()
-
(5)任意维度或大小的数组都可被作为函数参数传递
- 例如,以下函数参数为数组,将在Write窗口输出一个矩阵。
![图片]()
- 例如,以下函数参数为数组,将在Write窗口输出一个矩阵。
-
(6)部分数据类型的声明需要加
*号- 大部分CAPL支持的数据类型都可以直接声明为函数参数,例如,整型、浮点型、枚举、结构、定时器以及它们的引用。
- 但有一些类型不能被直接声明,而需要加上
*号(注意该符号并不是C语言中指针的意思)。 - message类型比较特殊,如果该变量是用户自定义的,那么在函数参数声明时,
message和message*均可以- 但如果该变量来自database,那么只有
message *可用。下面的例子是以database中的信号为例。
![图片]()
- 但如果该变量来自database,那么只有
无参数无返回值
格式要求
- 用的比较少
- 参数列表:空
- 返回值类型:void
- 示例:
void functionName(){//xxxxx;}
代码示例
- 定义无参无返回值函数test()
- 并在
on key 's'中调用on key 's' { $VehicleSpeed = 30; test();//调用此函数 } void test()//定义无参无返回值函数 { $VehicleSpeed = 100; }![图片]()
有参数无返回值
格式要求
- 参数列表:小括号填入对应的参数列表
参数类型 参数名 - 返回值类型:void
- 示例:
void functionName(参数类型 参数名){//xxxxx;}
代码示例
- 定义有参无返回值函数test(),在函数体中使用此参数
- 并在
on key 's'中调用 - 注意:test(xx) -- 调用时,括号中记得填入参数
on key 's' { $VehicleSpeed = 30; test(300);//调用test()函数,记得填入参数 } void test(int speed)//定义有参无返回值函数 { $VehicleSpeed = speed; }![图片]()
有参数有返回值函数
格式要求
- 重要!!!用得较多
- 关键字 return
- 参数列表:小括号填入对应的参数列表
参数类型 参数名 - 返回值类型:对应的返回值类型
- 示例:
返回值类型 functionName(参数类型 参数名){//xxxxx; return xxx;}
代码示例
- 定义有参有返回值函数test(),在函数体中使用此参数,并return返回值
- 并在
on key 's'中调用 - 注意:test(xx) -- 调用时,括号中记得填入参数
on key 's' { int arr[2] = {100,150};//[]中不定义元素个数会报错.. $VehicleSpeed = 30; $VehicleSpeed = test(arr); } int test(int arr[])//定义有参数有返回值的函数,注意返回值类型 { return arr[0] + arr[1];//用return返回 返回值 }![图片]()
有参数无返回的函数:操作定义好的变量
以结构体变量为例
- 无返回值:指的是不再额外申请空间,操作的是已有变量
定义结构体
- 结构体定义和初始化
variables { //xxxx 其他代码 struct test{//定义结构体 int x; int y; }; struct test MyTest;//创建结构体变量MyTest } on start { //xxxx 其他代码 MyTest.x = 0;//结构体内部变量初始化 MyTest.y = 0; //..... }
操作结构体
- 调用操作结构体的函数test(),并将结构体中的某个变量赋值给车速
on key 's' { $VehicleSpeed = 30; test(100,150);//调用操作结构体的函数test() $VehicleSpeed = MyTest.x;//将结构体中的某个变量赋值给车速 } void test(int a,int b)//定义操作结构体的函数 { MyTest.x = a+b; MyTest.y = a*b; }









浙公网安备 33010602011771号