通过变量名寻址变量[重复]

Posted

技术标签:

【中文标题】通过变量名寻址变量[重复]【英文标题】:Adressing variables by variable names [duplicate] 【发布时间】:2021-02-05 10:34:50 【问题描述】:

我目前正在编写一个 ROS 2 节点来将值从 PLC 通过 ROS 传递到可视化:

PLC 系统 --> ROS --> 可视化

由于 ROS 应该只传递数据,所以我希望能够尽可能少地配置接口。这个想法可以用 ROS 最好地实现,它是一个配置文件(.msg 文件),其中输入了变量的名称及其类型。其他一切都由此衍生。 我不可避免地遇到了这个问题:在 ROS 中,数据是通过所谓的消息传递的。这些消息是通过结构定义的,并且是从我的配置文件中自动生成的。为了给结构体中的变量赋值,我不想处理程序中硬编码的每一个变量,而是使用已知名称遍历结构体。

TLNR:变量可以用变量名来寻址吗?

我知道整个事情听起来有点混乱。我希望下面的例子能阐明我的意思:

#include <vector>
#include <string>

struct MsgFile

    int someVariable;
    int someOtherVariable;
;

using namespace std;

class Example

public:
    vector<string> variableNames"someVariable", "someOtherVariable";
    MsgFile message;

    void WriteVariables()
    
        for (auto const &varName : variableNames)
        
            message."varName" = 0;  //<-- pseudo code of what I'm thinking of     
        
    
;

问候 蒂尔曼

【问题讨论】:

您是否考虑在您的机器人中使用Lua?还是GNU guile?或者写你的GCC plugin?还是生成一些 C++ 代码?另见this draft report 和DECODER 【参考方案1】:

你不能使用这样的变量名。运行时没有变量名。如果您想要名称(字符串)和变量之间的映射,则需要自己添加。

如果您的“变量”属于同一类型,例如int,您可以使用映射:

#include <vector>
#include <string>
#include <unordered_map>    

using MsgFile = std::unordered_map<std::string,int>;


struct Example 
    std::vector<std::string> variableNames"someVariable", "someOtherVariable";
    MsgFile message;

    void WriteVariables() 
        for (auto const &varName : variableNames) 
            message[varName] = 0;  // add an entry  varName, 0  to the map
                                   // (or updates then entry for key==varName when it already existed)
        
    
;

如果您只需要字符串表示来访问它(而不是用于打印等),您可以考虑使用枚举作为键。至少我会定义一些常量,比如const std::string some_variable"some_variable",以避免错别字被忽视(也许variableNames 应该是const(和static?))。

【讨论】:

感谢您的回答。由于我最终被 ROS 绑定到 Struct,我想我将不得不对该部分进行硬编码。 @Tillman 你说它们是从配置文件生成的,你不能将它们生成为地图吗?在您的代码(和我的代码)中,名称和变量之间的映射在 Example 中完成,但也可以在 MsgFile 中完成【参考方案2】:

据我所知,没有标准的方法可以做到这一点,我会选择另一种方式来存储数据(我的意思不是在 struct 中),但如果你坚持,这里有一个已回答的问题: Get list of C structure members

【讨论】:

感谢您的回答。由于我最终被 ROS 绑定到 Struct,我想我将不得不对部分进行硬编码

以上是关于通过变量名寻址变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

ts不同文件变量名重复

从另一个类获取原始变量名[重复]

Python读取文件-传递变量名[重复]

从文件名中提取变量名[重复]

Python 2.7 列表理解泄漏变量名 [重复]

获取与python中的对象对应的所有可能变量名的列表[重复]