今天同事在運行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;
