2015-11-20 32 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