Loading...
墨滴

jasonj333

2021/06/24  阅读:48  主题:红绯

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的技术人员,他们给的答复是

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

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

def func2():
    func1()
    func1()

func2()  

打印的结果为

对嘛,这才是我们想要的结果

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

得到的答复是

但是我还是觉得第二次调用时的变量i和第一次调用时的变量i,虽然变量名相同,但是它们并不能看作是同一个变量

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


jasonj333

2021/06/24  阅读:48  主题:红绯

作者介绍

jasonj333