如何理解canopen通讯中的索引和子索引
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何理解canopen通讯中的索引和子索引相关的知识,希望对你有一定的参考价值。
参考技术A 1、首先设置对应的Can参数,比如波特率什么的。 2、导入对应设备的eds文件导入somachine。 3、如果用PDO的话就比较简单,打开对应设备,在CANopen I /O Mapping 中填入对应的变量,一般就启动命令,频率,转速什么的,就OK了。 4、如果是SDO的话...本回答被提问者采纳允许在查找时忽略子索引的复合索引的 C++ 容器
【中文标题】允许在查找时忽略子索引的复合索引的 C++ 容器【英文标题】:C++ container for compound index that allows ignoring sub-index at look-up 【发布时间】:2012-02-22 12:52:05 【问题描述】:什么是允许在查找时忽略子索引的复合索引的合适容器?它不应该比没有此功能的容器使用更多的资源。
F.e.给定索引
struct index_t
index_t(unsigned key_, unsigned subkey_)
: key(key_)
, subkey(subkey_)
unsigned key;
unsigned subkey;
;
插入
index_t(1,11)
index_t(2,21)
index_t(2,22)
index_t(2,23)
index_t(3,31)
所有带有 f.e. 的元素key == 2
并忽略 subkey
必须查找。
还必须可以使用给定的key
和 subkey
进行查找。因此,使用带有key
的多重集/映射作为唯一容器的键不是解决方案。
【问题讨论】:
我找到了解决方案,将在 8 小时超时后发布。multimap<key_t, multimap<subkey_t, data_t> >
将是一个解决方案,但会在存储和编程方面引入一些开销。
@hpc:感谢您正确地进行 Stack Overflow。在 1rep 用户中非常罕见。
不会发布我的解决方案,因为@StilesCrisis 解决方案非常完美。
【参考方案1】:
你可以这样做
std::set<index_t> mySet;
要搜索具有给定键和任何子键的所有项目,请执行
std::pair<std::set<index_t>::iterator, std::set<index_t>::iterator> range;
range.first = mySet.lower_bound(index_t(key, 0));
range.second = mySet.upper_bound(index_t(key, UINT_MAX));
这将保持 2*log n 的性能。
【讨论】:
当然,谢谢!如果从 lower_bound 迭代,则不需要调用upper_bound()
。
啊,它应该是range.second = mySet.upper_bound(index_t(key+1, 0));
,因为upper_bound()
(不像lower_bound()
)返回一个迭代器,指向一个严格来说更大的元素。
很高兴为您提供帮助!不过,不太清楚upper_bound
不起作用是什么意思。
我不是说upper_bound()
不工作。在第一条评论中,我的意思是如果迭代从下限开始直到key
发生变化,则不需要upper_bound()
。在第二条评论中,我注意到上限 index_t
必须设置为下一个更大的索引,因为迭代通常会在 it == range.second
处中断。
我认为lower_bound(index_t(key+1, 0))
或upper_bound(index_t(key, UINT_MAX))
都会做正确的事情。但我认为upper_bound(index_t(key+1, 0))
将包含值为key+1, 0
的条目。试试看你是否不同意。另外,您还打算发布您的解决方案吗?还是比这更复杂?以上是关于如何理解canopen通讯中的索引和子索引的主要内容,如果未能解决你的问题,请参考以下文章