2013-04-29 55 views
2

我有一個用於通信協議(USB設備描述符)的數組。該協議在數組標題中調用數組大小​​。所以我想這樣做(這是禁止的):如何把數組大小內的數組初始化本身在C?

static uint8_t array[]= { 
    TYPE, 
    sizeof(array), 
    other data... 
}; 

的陣列中的存儲器的只讀部分是,我不能在事後重寫相關的細胞,而我不是真的願意複製它來覆蓋單元(它在最小的嵌入式系統中)。我需要它看起來像「在電線上」,因爲它會通過DMA。

是否有某種魔法可以解決這個限制?我願意使用C99或GNU擴展。我不會爲此而切換,但我也對C++解決方案感到好奇。

+1

並指定在聲明數組的大小,例如作爲'靜態uint8_t數組[18] = ...'大概沒有比'爲什麼不用手工輸入數組的大小而不使用sizeof'更有幫助的解決方案? – Tommy 2013-04-29 19:34:01

+0

「數組在內存的只讀部分」除非省略'const',否則不能。 – 2013-04-29 19:39:51

+0

@danielFischer很好,趕上,謝謝。但是無論有沒有'const',這些東西都會在內存映射的一個鎖定部分中結束。 – nraynaud 2013-04-29 19:58:16

回答

3

如果你不會使用數組,而是一個結構,它看起來像你真正想要的,那麼這將是可能的:

typedef struct 
{  int  type, size, other; 
} pack_t; 
static pack_t a = 
{  10, sizeof(a), 11 
}; 
+0

絕妙的主意,謝謝。 – nraynaud 2013-04-29 19:58:43

+0

這裏是結果:https://gist.github.com/nraynaud/5484759我叮the線數很高,你看到一個更緊湊的方式來做到這一點?這太糟糕了,我不能直接在結構中使用'='。 – nraynaud 2013-04-29 21:05:59

+2

您當然可以丟失字段名稱,但這不會有助於提高可讀性。如果你必須製作許多這樣的描述符,我會在大部分標準值中填充一個宏,並從宏參數中選取不同的值。 – 2013-04-29 21:22:35