2011-01-11 118 views
0

好吧,我有如何將結構添加到C中的結構數組?

typedef struct 
{ 
    enum COMMAND command; 
    enum CMD_SOURCE source; 
    CHAR parameters[16]; 
} focuserCommand; 

定義爲這樣的結構......我試圖做出將這種類型的結構的一個實例添加到focuserCommands陣列功能。數組的定義是這樣的...

extern focuserCommand CommandBuffer[CMD_BUFFER_SIZE]; 

我想寫應該採取一個指向focuserCommand並將其添加到CommandBuffer功能。我正在實現CommandBuffer作爲FIFO環形緩衝區,所以我知道我需要移動尾部forwared,以便其他函數可以看到緩衝區包含數據。 CmdBuffHead和CmdBuffTail表示緩衝區的讀寫指針。寫入被添加到尾部,從頭部讀取。

void AddCmdToBfr(focuserCommand * cmd) 
{ 
// What goes here to add the struct pointed to by cmd to 
    // element CmdBuffTail of the buffer? 

    CmdBuffTail++; 
} 

回答

1

假設你有變量CmdBuffTailCommandBuffer下一個元素指向被寫入,那麼:

void AddCmdToBfr(focusCommand *cmd) 
{ 
    assert(CmdBuffTail >= 0 && CmdBuffTail < CMD_BUFFER_SIZE); 
    CommandBuffer[CmdBuffTail++] = *cmd; 
    if (CmdBuffTail >= CMD_BUFFER_SIZE) 
     CmdBuffTail = 0; 
} 

這會保留你所需要的不變 - 該指數在該範圍內0..CMD_BUFFER_SIZE-1。

您可能還需要一個單獨的索引(CmdBuffHead也許)來識別從哪裏讀取。如果是這樣,如果CmdBuffTail趕上它,你可能需要更改AddCmdToBfr()中的值。


修復了複製傳入命令後,我發現你需要仔細考慮內存管理。在這種情況下,您的focususerCommand結構非常簡單(除非typedef CHAR隱藏了一個指針 - 在這種情況下,拍掌;不要隱藏指針),您可以簡單地將其複製而不受懲罰。如果你不能簡單地複製結構(因爲它包含指向已分配內存的指針),那麼你需要確保你瞭解誰擁有數據,以確保(a)釋放任何分配的內存,以及(b)任何分配的內存只發布一次。例如,這意味着,不是僅僅將新的命令複製到舊的命令上,而是必須首先釋放分配給舊條目的內存。考慮C + +複製構造函數和析構函數 - 在C.

+0

我試過這個,但我得到一個編譯器錯誤`CommandBuffer [CmdBuffTail ++] = cmd;`說在賦值中不兼容的類型。是因爲cmd是一個指向結構體的指針而不是結構本身? – PICyourBrain 2011-01-11 15:03:31