capl中關於宣告變數並賦值的問題
阿新 • • 發佈:2021-07-10
今天同事在執行capl指令碼時遇到一個問題,由於指令碼內容太多,我把問題點寫成了demo,大概是這樣
void func1() { int i = 3; write("i value: %d", i); i++; } on key 'y' { func1(); func1(); func1(); }
當我在CANoe上點選按鍵y呼叫三次func1()函式時,在write視窗列印的結果如下
你會發現當我第一次呼叫func1()時,i的值為3,第二次呼叫值為4,第三次呼叫值為5
按道理來說,每一次呼叫func1(),都會先宣告一個變數,然後初始化為3,緊接著就列印它的值,然後才會給這個變數加1
那麼其實第二次呼叫func1()時宣告的變數i並不是第一次呼叫時的變數i,雖然它們在func1()內部名稱是i,但是它只限於在func1()內部使用,當函式func1()執行完畢時,這個函式內的所有的區域性變數應該都釋放了才對
既然第二次呼叫時第一次的變數i都釋放了,而且第二次的變數i和第一次的根本不是同一個,那為什麼打印出的值會是第一次呼叫函式結束時的值?
變數i又不是一個全域性變數,如果是一個全域性變數,還能說得通
然後我又寫了一個demo來對比
void func1() { int i; i = 3; write("i value: %d", i); i++; } on key 'y' { func1(); func1(); func1(); }
看看列印的結果
這才符合我們的預期
為什麼這兩種寫法會有不同的結果呢?
int i = 3;
int i; i = 3;
我詢問了vector的技術人員,他們給的答覆是
但是這種說法並不能令我信服,所以我又在python上試了下
def func1(): i = 1 print(i) i = i + 1 def func2(): func1() func1() func2()
列印的結果為
那為什麼capl中會出現這個問題,我又繼續追問vector的技術支援
對於函式內定義的變數來說,其他的程式雖然無法直接使用它,但是如果呼叫這個函式,就會建立這個變數,當函式執行完畢後,這個變數卻不會釋放,如果再次呼叫這個函式時,這個變數的值就會是上一次呼叫這個函式時變數的值
解決辦法嘛,就是宣告變數時,另外賦值,比如這樣
int i; i = 3;
所以,就這樣吧,以後用的時候還是不要宣告時賦值比較好,比如這樣
int i = 3;