1. 程式人生 > 其它 >capl中關於宣告變數並賦值的問題

capl中關於宣告變數並賦值的問題

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