2015-11-20 31 views
-1

排序版本:我有一个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套接字发送的系统获取信息)的reskin。我将旧数据结构转换为这个结构,因为我需要访问u_char所代表的真实值。

+5

只是尝试'结构data_value渠道[16] ' –

+0

香草C++还没有办法。幸运的是,阵列应该在这里为你工作。 – chris

+7

将数字添加到变量名的末尾是一个明确的标志,表示您应该使用数组。 – clcto

回答

2

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

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

我也应该注意到,这不是你应该真的在C++中做的事情。这是C方式。 C++有更多更好的提供。

+4

IMO,这不是真正的C方式来处理这个特定的问题。 – Hurkyl

+0

你有一点。 –

+0

我从C中完成的网络示例中了解到我如何完成整个操作(您从这段代码中看不到这些代码,这很复杂)。 – GreySage

3

您可以使用数组是这样的:

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 
+0

这也表明他正在使用并行阵列。也许更好的是将这些结合到一个结构中。 – clcto

+0

@clcto:也许吧。也许不会。 – Deduplicator