• 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'])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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]);
      }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 输出结果:

    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]);
      }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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]);
      }
    
    • 1
    • 2
    • 3
    • 4
    • 可以在循环中增加或者更改 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]); 
      }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    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;
        }            
      }
      
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 输出结果:

    调用函数之前:
    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 不存在");
      }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

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

    on key 'd'
    {
      long setSignal[char []];
      
      setSignal["speed"] = 80;
      setSignal["igin"] = 1;
      
      write("setSignal key/value number:%d",setSignal.size());
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    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]); 
      } 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    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());
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    setSignal key/value number:0

    在这里插入图片描述

    🌎总结

    23

    7

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

    • 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
      18
  • 相关阅读:
    创新实战|从5大维度成功实现传统研发向敏捷研发转型
    一文详解:什么是进销存管理系统?2023年top10进销存管理系统大推荐!
    SOLIDWORKS 2024新功能--Electrical篇
    DIY一个智能音箱
    工业外观设计成为产品核心竞争优势之一
    Python库学习(十二):数据分析Pandas[下篇]
    Linux文件管理知识查找文件
    【网络安全带你练爬虫-100练】第20练:数据处理-并写入到指定文档位置
    Git工具的使用
    力扣第20题记录
  • 原文地址:https://blog.csdn.net/qq_34414530/article/details/126055577