CAPL中的键值对(hash)数据类型


📘前言

  • 🍅 键值对(Key - Value)又名哈希(hash),各种编程语言都会有的一种数据类型,Python中叫字典,CAPL中叫 语义场联想(Associative fields ),本节想通过Python和CAPL的角度讲解下key-value的使用

  • 🍅 演示软硬件环境 Windows11 x64CANoe 11 SP2 x64
    请添加图片描述

在这里插入图片描述


📙 CAPL和Python的简单对比

1️⃣ python下是字典的数据类型,通过花括号定义,可以初始化

  • 键一般是唯一的,如果重复最后的一个键值对会替换前面的,值不需要唯一。
  • 值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。
tinydict = {'Name': 'Zara', 'Age': 7, 'sex': 'boy'}# 定义字典并初始化
tinydict['Age'] = 8 # 更新
tinydict['School'] = "RUNOOB" # 添加
 
 
print( "tinydict['Age']: ", tinydict['Age'])
print( "tinydict['School']: ", tinydict['School'])

2️⃣ CAPL中叫Associative fields ,定义方法如下

  • capl定义如下图,key,value的数据类型可以是: long, int64, float, double, enumeration types and char[].
  • 不像python,在同一个变量中,value可以是整形,也可以是字符串,CAPL中,只能是同一种数据类型

在这里插入图片描述

  • 下面代码key 和value 都是 字符串类型的
on key 'a'
{
  char[20] tinydict[char []];
  
  strncpy(tinydict["Name"], "Zara", 20); 
  strncpy(tinydict["Age"],  "7",    20);
  strncpy(tinydict["sex"],  "boy",  20); 

  for (char[] mykey : tinydict)
  {
    write("%s is mapped to %s", mykey, tinydict[mykey]);
  }

}

  • 输出结果:

Age is mapped to 7
Name is mapped to Zara
sex is mapped to boy

  • 下面代码key 字符串类型的,Value是long类型
on key 'b'
{
  long setSignal[char []];
  
  setSignal["speed"] = 80;
  setSignal["igin"] = 1;
  
  for (char [] mykey : setSignal)
  {
    write("%s is mapped to %d", mykey, setSignal[mykey]);
  }

}

3️⃣ 特殊的for 语句

  • 这个for 循环是特殊的,就是这个结构 char[] 是key的数据类型;mykey,可以随意定义,代表key;setSignal是keyvalue 变量名
  • for循环所以是按照key的升序来的,仔细看下上面打印输出,Age ,Name ,sex先后打印出来,并不是按照赋值的顺序。
  for (char [] mykey : setSignal)
  {
    write("%s is mapped to %d", mykey, setSignal[mykey]);
  }
  • 可以在循环中增加或者更改 value的
on key 'b'
{
  long setSignal[char []];
  
  setSignal["speed"] = 80;
  setSignal["igin"] = 1;
  
  for (char [] mykey : setSignal)
  {
    if (setSignal[mykey] == 80)
    {
      setSignal[mykey] = 90;     
      setSignal["drivemode"] = 7;
    }            
    write("%s is mapped to %d", mykey, setSignal[mykey]); 
  }
}


4️⃣ 作为函数参数传递

on key 'c'
{
  long setSignal[char []];
  
  setSignal["speed"] = 80;
  setSignal["igin"] = 1;
  
  write("调用函数之前:"); 
  for (char [] mykey : setSignal)
  {           
    write("%s is mapped to %d", mykey, setSignal[mykey]); 
  }
  
  printMap(setSignal);
  
  write("调用函数之后:"); 
  for (char [] mykey : setSignal)
  {           
    write("%s is mapped to %d", mykey, setSignal[mykey]); 
  } 
  
}

void printMap(long m[char []])
{
  for (char [] mykey : m)
  {
    if (m[mykey] == 80)
    {
      m[mykey] = 90;     
      m["drivemode"] = 7;
    }            
  }
  
}
  • 输出结果:

调用函数之前:
igin is mapped to 1
speed is mapped to 80
调用函数之后:
drivemode is mapped to 7
igin is mapped to 1
speed is mapped to 90


5️⃣ 内置函数containsKey 检查key是否存在

on key 'd'
{
  long setSignal[char []];
  
  setSignal["speed"] = 80;
  setSignal["igin"] = 1;
  
  if (setSignal.containsKey("speed")) 
  { 
    write("key speed 存在");
  }
  else
  {
    write("key speed 不存在");
  }
}


6️⃣ 内置函数size 统计键值对个数

on key 'd'
{
  long setSignal[char []];
  
  setSignal["speed"] = 80;
  setSignal["igin"] = 1;
  
  write("setSignal key/value number:%d",setSignal.size());
}

setSignal key/value number:2


7️⃣ 内置函数remove 根据key删除一个key/value

on key 'd'
{
  long setSignal[char []];
  
  setSignal["speed"] = 80;
  setSignal["igin"] = 1;
  
  setSignal.remove("speed");

   for (char [] mykey : setSignal)
  {           
    write("%s is mapped to %d", mykey, setSignal[mykey]); 
  } 
}

igin is mapped to 1


7️⃣ 内置函数clear 删除所有key/value

on key 'd'
{
  long setSignal[char []];
  
  setSignal["speed"] = 80;
  setSignal["igin"] = 1;
  
  setSignal.clear();
  write("setSignal key/value number:%d",setSignal.size());
}

setSignal key/value number:0

📙 结构体键值对复合数据

/*@!Encoding:936*/
variables 
{
    struct msgdef
  {
    char name[34];
    char txNode[34];
    dword id;
    dword dlc;
    long cycle;

  };
  struct msgdef CAN_BUS_MSG[long, 200];
}



on message *
  
{
  if(!CAN_BUS_MSG.containsKey(this.id))
  {
    
    strncpy(CAN_BUS_MSG[this.id].name,this.name,elcount(CAN_BUS_MSG[this.id].name));
    strncpy(CAN_BUS_MSG[this.id].txNode,"%NODE_NAME%",elcount(CAN_BUS_MSG[this.id].txNode));
    CAN_BUS_MSG[this.id].id = this.id;
     CAN_BUS_MSG[this.id].dlc = this.dlc;
    CAN_BUS_MSG[this.id].cycle = DBLookup(this).GenMsgCycleTime;
    
  }
  
}

on key 'a'
{
  for(long id : CAN_BUS_MSG)
  {
    write("CAN_BUS_MSG[id].name : %s",CAN_BUS_MSG[id].name);
    write("CAN_BUS_MSG[id].txNode : %s",CAN_BUS_MSG[id].txNode);   
    write("CAN_BUS_MSG[id].id : %x",CAN_BUS_MSG[id].id);
    write("CAN_BUS_MSG[id].dlc : %d",CAN_BUS_MSG[id].dlc);
    write("CAN_BUS_MSG[id].cycle : %d",CAN_BUS_MSG[id].cycle);
    write("_______________________________________________");
  }
}

在这里插入图片描述

在这里插入图片描述

🌎总结

23

7

  • 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!

  • 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
    18
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蚂蚁小兵

慢慢长夜磨一章好文章,费烟!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值