2013-08-27 82 views
2

目前,我已經工作的代碼讀取這樣的:動態輸入

char input[4][10] = {ARR1, ARR2, ARR3, ARR4}; 

顯然,我建立與這些一維數組,這是在別處定義的常量的2D陣列。但是,我需要更改此代碼,以便從文件中讀取所需的1d數組的名稱並相應地初始化2d數組。

例如,如果該文件包含:

ARR9 ARR3 ARR5 ARR7

然後,初始化將運行等(假定所有這些陣列都被定義):

char input[4][10] = {ARR9, ARR3, ARR5, ARR7}; 

我從文件中讀取沒有問題,但在創建2d數組時遇到困難,並且使用從文件中讀取的值作爲數組的名稱。

+0

如果你知道二維數組的大小,你可以malloc一個二維數組,然後用一維數組的值填充它 – jambono

回答

2

C沒有introspectionreflection,所以它不是真的有可能的方式。

但是,您可以有一個轉換表,從"ARR1""ARR2"等翻譯,實際陣列,然後你可以從實際的數組內容複製到input條目。或代替陣列具有陣列像你現在,你可以有一個指針數組,只是設置指針指向正確的數組。

+0

這種方法可能的打嗝是我不知道所有數組的名稱可能可能會通過文件傳入。是否有可能有一個字符串匹配同名的數組轉換表(假設用戶寫了一個有效的數組名),而不是簡單地字符串和數組的名稱之間的映射是預先確定的? –

+0

@ C.Williamson沒有在運行期間得到標識符名稱的方式,標識只是一個概念的來源和有沒有相應的運行理念。 –

+2

@ C.Williamson還有另一種解決方案,那就是陣列本身存儲在你的程序的執行過程中讀取文件。然後,您可以將它們存儲爲具有其名稱和值的文件格式。 –

0

比方說, 「常量別處定義」 目前這個樣子

const char *ARR1 = "Alpha"; 
const char *ARR2 = "Bravo"; 
const char *ARR3 = "Charlie"; 

解決方案1 ​​

const char *ARR_Value[] = "Alpha", "Bravo", "Charlie", 0; 
const char *ARR_Name[] = "ARR1", "ARR2", "ARR3", 0; 
// Pseudo code 
Read file keyword 
find matching ARR_Name[] 
apply corresponding ARR_Value[] to input[] 

一個更優雅的解決方案

typedef struct { 
    const char *Name; 
    const char *Value; 
    } ARR_t; 

const ARR_t ARR[] = { 
    { "ARR1", "Alpha"}, 
    { "ARR2", "Bravo"}, 
    { "ARR3", "Charlie"}, 
    { 0, 0} 
}; 

// Pseudo code 
Read file keyword 
find matching ARR[] by doing strcmp(keyword, ARR[i].Name) 
apply corresponding ARR[i].Value to input[] 

如果OP不明確需要初始化和n切換輸入[]的內容或不作爲後是char input[4][10],而不是const char input[4][10]

+0

我看到我遲到了派對。 – chux