capl中关于声明变量并赋值的问题

今天同事在运行capl脚本时遇到一个问题,由于脚本内容太多,我把问题点写成了demo,大概是这样

void func1()
{
  int i = 3;
  write("i value: %d", i);
  i++;
}

on key 'y'
{
  func1();
  func1();
  func1();
}

当我在CANoe上点击按键y调用三次func1()函数时,在write窗口打印的结果如下

capl中关于声明变量并赋值的问题

你会发现当我第一次调用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();
}  

看看打印的结果

capl中关于声明变量并赋值的问题

 

 

 这才符合我们的预期

为什么这两种写法会有不同的结果呢?

int i = 3; 

 

int i;  
i = 3; 

我询问了vector的技术人员,他们给的答复是

 capl中关于声明变量并赋值的问题

 

 

 但是这种说法并不能令我信服,所以我又在python上试了下

def func1():
    i = 1
    print(i)
    i = i + 1

def func2():
    func1()
    func1()

func2()

打印的结果为  

capl中关于声明变量并赋值的问题

 

 那为什么capl中会出现这个问题,我又继续追问vector的技术支持

capl中关于声明变量并赋值的问题

 

 对于函数内定义的变量来说,其他的程序虽然无法直接使用它,但是如果调用这个函数,就会创建这个变量,当函数执行完毕后,这个变量却不会释放,如果再次调用这个函数时,这个变量的值就会是上一次调用这个函数时变量的值

解决办法嘛,就是声明变量时,另外赋值,比如这样

int i;
i = 3;

 所以,就这样吧,以后用的时候还是不要声明时赋值比较好,比如这样 

int i = 3; 

  

 

上一篇:守护进程,锁,队列(生产者消费者模型)


下一篇:37.第六章 Shell脚本编程高级进阶(二)