CAPL语言学习
一、變量的聲明與定義
1.變量名命名規則
????????變量名的命名規則與C語言類似,必須注意遵循合法性、有效性和易讀性的原則。 ? ? ? ? 主要規則: ????????(1)在名稱中只能使用字母字符、數字和下畫線(_); ????????(2)名稱的第一個字符不能是數字; ????????(3)區分大小寫字符; ????????(4)不能將CAPL關鍵字用作名稱; ????????(5)不能將CAPL的函數名和對象名用作變量名。 ????????注:CAPL語言中為了用戶使用的方便 靈活,編譯器不區分CAPL自帶的關鍵字和函數名的大小寫,例如 DWORD、dword和Dword在代碼中使用效果一樣,所以用戶定義變量時也需要避免此類情況。2.全局變量與局部變量
? ? ? ? 全局變量需要在Variables內部被聲明,若無初始值則被默認為0 ? ? ? ? 對于局部變量,初始化只發生在程序體啟動時執行,當再次進入程序時,局部變量被假定 是上一次跳出程序時的值。 ?---------------------------------------------------對以上進行驗證------------------------------------------------- ????????(1)對于局部變量進行測試 on key 'a'{int i = 0;i++;write("i = %d",i);write("----------------"); }on key 'b'{int i ;i = 0;i++;write("i = %d",i);write("----------------"); }????????對于局部變量,在按a觸發事件中在定義時對局部變量進行了顯式的初始化,而在按b觸發事件中除了在定義時對局部變量進行了顯式的初始化,還額外用指令進行了顯式的初始化。
????????在主函數中先對a事件調用三次,后對b事件觸發2次,下圖即為打印結果。
????????觀測結果顯然,在第二次觸發按a觸發事件時,其局部變量i的初值并不是0,而是上一次調用退出時的值1,可見具有標準C靜態變量的特性。因此建議在編寫程序時,建議定義局部變量之后,再單獨進行顯示的初始化。
? ? ? ? (2)對于全局變量
variables {int i = 0; }on key 'a'{write("i的第一次值 = %d",i);i++;write("i = %d",i);write("----------------"); }on key 'b'{i=0;write("i的第一次值 = %d",i);i++;write("i = %d",i);write("----------------"); }????????對于全局變量,在按a觸發事件中并未做顯示的初始化,只做了運算;而在按b觸發事件中用指令進行了顯式的初始化。
??在主函數中第一次觸發按a觸發事件,第二次觸發按b觸發事件,然后對a事件和b事件交替觸發。下圖即為打印結果。
????????觀測結果顯然,在第二次觸發按a觸發事件時,其局部變量i的初值并不是0,而是上一次調用退出時的值1,可見具有標準C靜態變量的特性。因此建議在編寫程序時,建議定義局部變量之后,再單獨進行顯示的初始化。
?------------------------------------------------------驗證完畢----------------------------------------------------------
二、簡單變量
1.整型
????????整數就是沒有小數部分的數字,如3、201、-3412和0。根據數值的大小不同,CAPL提供了以下幾種整型,如下圖所示。
?2.字符
????????CAPL未將char類型(長度1B)歸類至整型中,這 是因為在CANoe中提供了byte類型。如果數據是具體數值則應使用 byte,而對于字符,則應用char(字符串使用char數組)。char類型 和byte類型之間可以直接轉換,例如:
on key 'a'{byte data1 = 100;char ch1 = 'd';ch1 = 0x62;data1 = 's';write("ch1 = %d",ch1);write("data1 = %d",data1); }三、復合類型
1.結構
????????CAPL中可以簡單地按照C語言的方法來聲明結構(struct),但結構名在程序中必須是唯一的。
????????用戶可以在類型定義時直接聲明結構類型的變量,在這種情況下,類型的名稱可以省略,也可以直接使用結構的名字來引用類型。
on key 'a'{ struct {int Ma;int English;int His;}sunbo; sunbo.English =100; sunbo.Ma = 99; sunbo.His = 98; write("Math = %d English = %d History = %d",sunbo.Ma,sunbo.English,sunbo.His); }on key 'b'{ struct Sc {int Ma;int English;int His;}; struct Sc sunbo ={ 100, 99, 98 }; write("Math = %d English = %d History = %d",sunbo.Ma,sunbo.English,sunbo.His); } ????????使 用 “.” 操 作 符 可 以 訪 問 結 構 中 的 成 員 ,例 如 ,?myScores.Chinese = 100。另外,結構可以作為參數傳給函數,但不能作為函數的返回值。2.枚舉
????????枚舉(enum)類型的聲明也與C語言中的語法完全一致,但需要 注意的是,枚舉的成員名必須唯一,否則將有可能代替隱藏數據庫中同名的報文和信號。 ????????聲明枚舉的同時對成員進行賦值 on key 'b'{ enum colors { red = 1,green = 2,Blue = 3 }; write("Red = %d green = %d blue = %d",red,green,Blue); } 輸出結果: ????????如果沒有在聲明枚舉的同時對成員進行賦值,編譯器將按照成員聲明的順序對成員進行初始化。即第一個成員被初始化為0,往后依次加1。 on key 'a'{ enum { Apple,Peer,Banana} fruit = Apple; write("a = %d b = %d c = %d",Apple,Peer,Banana); }????????輸出結果:
3.數組
?????????CAPL支持直接用字符串初始化字符數組的行為。
on key 'a'{int a[3] = {1,2,3};char b[13] = "Hello Word!";//"Hello Word"為字符串形式,此行驗證了用字符串初始化字符數組long c[] = {777,888,999};//無效,在CAPL中必須顯示定義數組的長度, } ????????可 以 通 過 內 建 函 數elCount(數組名)來獲得數組成員的個數。如果數組的索引超出范 圍,即小于零或大于等于數組長度,CAPL將會在數組下標前提示錯誤。 on key 'b'{int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};int b[3] = {1,2,3} ;int c = elcount(a) ;//c = 3int d = a[4]; //超過邊界范圍錯誤 }四、特殊類型
1.報文
????????使用關鍵字message來聲明一個報文變量,當使用message聲明報文變量時,默認變量為CAN報文變量。當有數據庫支撐的時候,一個完整的聲明應該包括message ID或者message name。結合database的例子,使用ID 0xA或者報文名來聲明一條數據庫中的EngineData報文。
????????以標識符“x”結尾的ID表示這是一個擴展幀ID,例如,100x。而“*”則表明這條報文在聲明時還不含有CAN ID。
????????切記,使用這種方式聲明報文時,一定要指定ID后才能將msg發送出去。CAPL提供了一系列的選擇器(Selector)以保證用戶能夠按照自己的意圖去修改CAN message的屬性,下圖列出了CAN報文屬性及相關信息。
2.定時器?
????????CAPL 提 供 了 兩 種 定 時 器 變 量 : timer 基 于 秒 的 時 間 單 位 ; msTimer基于毫秒的時間單位
Timer CLK1;//建立名稱為CKL1的以秒為單位計時器 msTimer CLK2;//建立名稱為CLK2的以毫秒為單位的計時器四、常見運算
五、流程控制?
1.if格式、if與else格式
variables {int a; }on start{a=0;if (a<50){a++;write("a = %d",a);}else {a--;write("a = %d",a);} }2.switch語句
????????執行switch語句時,將變量逐個與case后的常量進行比較,若與其中一個相等,則執行該常量下的語句,若不與任何一個常量相等, 則執行default后面的語句。 on start {int a,b=10;a=10;switch (a) {case(2):a++;write("a1 = %d",a);break;case(10):a--;write("a2 = %d",a);break;case(3):a--;write("a3 = %d",a);break;default:a++; write("a4 = %d",a);break;} }? ? ? ? 以上case內必須加入“break;”否則switch將執行正確條件下的所有語句,不再判斷。
總結
- 上一篇: 易语言:实例讲解所有流程控制命令
- 下一篇: 熵权法确定权重