繁体   English   中英

如何在循环中访问结构的成员?

[英]How can I access the members of a struct in a loop?

排序版本:我有一个for循环,并且在每次迭代中我都想访问结构的其他成员(按顺序)。 这在C ++中可能吗? 我记得当我在学校学习这种东西时有可能回到过去,但是我可能一直在想一个较低层次的语言/系统。

详细信息:这是我的结构:

struct meg_data_packet { /* decodes a meg data packet */
    struct data_value channel0;
    struct data_value channel1;
    struct data_value channel2;
    struct data_value channel3;
    struct data_value channel4;
    struct data_value channel5;
    struct data_value channel6;
    struct data_value channel7;
    struct data_value channel8;
    struct data_value channel9;
    struct data_value channel10;
    struct data_value channel11;
    struct data_value channel12;
    struct data_value channel13;
    struct data_value channel14;
    struct data_value channel15;
    char reset_flag0;
    char reset_flag1;
    char reset_flag2;
    char reset_flag3;
    char reset_flag4;
    char reset_flag5;
    char reset_flag6;
    char reset_flag7;
    char reset_flag8;
    char reset_flag9;
    char reset_flag10;
    char reset_flag11;
    char reset_flag12;
    char reset_flag13;
    char reset_flag14;
    char reset_flag15;
    uint32_t sequence_number;
};

data_value是一个仅包含uint32_t的简单结构。 我希望能够访问成员以类似的方式来meg_data_packet[0]越来越channel0[1]越来越channel1等等。

编辑:哇,这些是一些快速答复。 我应该更清楚了。 由于无法初始化结构,因此无法使用数组。 它基本上只是现有数据结构的外观(实际上是u_char的数组,我正在从通过tcp套接字发送的系统中获取信息)。 我将旧的数据结构转换为该数据结构以利用它的结构,因为我需要访问u_char表示的实际值。

您可以使用如下数组:

struct meg_data_packet { /* decodes a meg data packet */
    data_value channels[16];
    char reset_flags[16];
    uint32_t sequence_number;
};

或者更好的是std::array

struct meg_data_packet { /* decodes a meg data packet */
    std::array<data_value, 16> channels;
    std::array<char, 16> reset_flags;
    uint32_t sequence_number;
};

访问这样的元素:

meg_data_packet mdp =get_packet();
mdp.channels[0] = ... // access by index 0-15

是的,有可能。 使用offsetof初始化指针偏移量数组。 然后将其添加到reinterpret_cast<char*>(&struct_var) ,将其reinterpret_cast<char*>(&struct_var)转换为目标类型,然后就可以开始……您有一个指向该成员的指针,可以按顺序对其进行迭代。

当然,您将需要两个循环,一个循环用于data_values,一个循环用于reset_flags。

我还应该注意,这并不是您真正应该使用C ++进行操作的方式。 这就是C方式。 C ++提供了更多更好的功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM