內容提要:如何定義一個任意大小的2D數組,然後在編譯時確定其尺寸?
- 如何可以定義C中的任意大小的2D陣列?
- 如何在編譯時確定該數組的維數?
披露:
我的嵌入式控制器編寫代碼。我的應用程序需要幾個不同大小的查找表,這些查找表將全部由一個查找功能(二進制搜索)使用。這是我到目前爲止:
typedef struct
{
unsigned char count; // number of rows in the table
unsigned char width; // number of bytes in each row
const unsigned char * data; // pointer to table data[count][width]
}
LookupTable;
// returns the index of a value from within a table
unsigned char Lookup(unsigned long value, const LookupTable * table);
這部分工作。我現在想要做的是在源代碼中定義這些表格,而無需手動輸入常量count
和width
。以下是我現在做:
#define T1_count 100
#define T1_width 3
const unsigned char table1_data[T1_count][T1_width] =
{
{ 0x12, 0x34, 0x56 },
{ 0x12, 0x38, 0x12 },
...
};
const LookupTable table1 = { T1_count, T1_width, table1_data };
這裏是什麼,我會喜歡要能夠做到(僞代碼,因爲這個數組定義實際上不會編譯):
const unsigned char table1_data[] =
{
{ 0x12, 0x34, 0x56 },
{ 0x12, 0x38, 0x12 },
...
};
const LookupTable table1 =
{
get_count_expr(table1_data),
get_width_expr(table1_data),
table1_data
};
顯然,get_count_expr
和get_width_expr
必須是基於表大小的某種常量表達式,而不是實際的函數調用。
要清楚的是,這個設計的任何部分都沒有石頭。我只是發佈我迄今爲止的內容,希望我的意圖很明確。任何改進的想法將不勝感激。
「爲什麼」:
這些表會經常改變,它將使維護更加容易,如果可以添加和刪除條目,或表格的寬度,而無需手動調整常數改變每一次。必須手動記錄尺寸可能容易出錯,並且違反了DRY。我正在尋找更好的方法。
+1這已經是一個很大的改進。使用相同的邏輯,我也可以設置'T1_width = sizeof * table1_data;',這幾乎是完美的。手動輸入的唯一東西是數組定義中的寬度,這不是世界的盡頭。 – 2010-10-01 22:03:08
'T1_width'以前被定義爲預處理器宏。我已經更改了代碼(但現在您的宏和變量都具有相同的值)。 – pmg 2010-10-02 10:05:07