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