2012-05-15 296 views
0

我正在嘗試查看錶格。這是藉口:將用戶輸入字符串與MACRO名稱進行比較

假設,以下是某些宏的定義列表。

#define ENTITY1 0x10001001 
#define ENTITY2 0x10001002 
. 
. 
. 

的ENTITY_是否則無符號長整數型值的用戶可讀的字符串值,並且可以存在任何數量的宏(說大於200或甚至500)。

現在,有一個列表可以跟蹤哪個實體存在於哪個文件編號中。例如:

0x10001001 1 
0x10001002 2 
0x10001003 3 
. 
. 
. 

由於專有約定,每個ENTITY使用長無符號整數是必需的。

第一個列表已經存在,第二個列表需要在用戶輸入記錄時通過使用第一個列表的#define中的宏字符串通過程序生成。由於這些條目的數量非常大,因此對每個值進行硬編碼是一項繁重的任務。另外,如果更新第一個列表,如果沒有編碼額外的開關情況,第二個列表將不會適當更新。

當用戶輸入一個條目時,他通過一個字符串變量告訴該條目將在ENTITY3中創建,如果一個宏以名稱ENTITY3存在,系統應該查找該條目。如果是,則用數字3打開文件並進行必要的處理,否則顯示警告:這樣的條目不存在。

那麼,如何在不使用SWITCH CASE的情況下將用戶輸入的字符串變量與宏名稱進行比較?

我正在使用C編程。 GNU C庫。


編輯:這是場景。

名爲ENTITYn(n可以是任何數字)的不同實體可以存在於具有特定整數1,2,3的不同文件中...但是,專有環境已經建立了這些實體,使得它們是使用某些無符號的長整數(如0x01001001等)進行識別。對於每個實體,已經在與這些實體對應的某些頭文件中通過名稱ENTITY1 ENTITY2 ... 定義了宏。現在,當某個管理員想要更改某些內容或輸入某些數據對於一個特定的實體,他將使用名稱ENTITYn來尋址,程序將在查找表中查找相應的條目。如果找到匹配項,它將使用該實體的無符號長整數代碼用於專有系統內部的後續處理,訪問另一個查找表,查找哪個文件編號具有此條目並打開該文件位置進行處理。

我需要使用實體的無符號長整型和它們相應的位置(讓所有實體現在處於單個文件1中)填充此第二個表。我想規避這種情況,即使那個LUT必須知道相應的實體無符號長整數代碼。該程序使用輸入字符串即ENTITY1並直接映射它。

但現在我開始認爲對LUT進行硬編碼將是一個更好的選擇。 :)

+0

我已經爲您的問題寫了一個初步的答案,但我沒有完全理解您的方案。你是否試圖在運行時將一個字符串(例如「ENTITY1」)映射爲一個整數(0x10001001)? –

回答

0

宏是預處理器功能,它們對C編譯器不可見。所以你不能直接引用代碼中宏的「值」。

這似乎需要兩個查找表,如果我得到這個正確:

  1. 一個表映射一個字符串,如ENTITY1到一個獨特的無符號整數,如0x10001001
  2. 將無符號整數(例如0x10001001)映射到「文件編號」的一個表,該文件編號看起來像(小)無符號整數,如1

這兩個表都可以通過處理您似乎有的源代碼生成。我會建議收集ENTITYn串弄成這個樣子:

struct entity_info 
{ 
    const char *name; 
    unsigned int key; 
}; 

然後讓你的前處理代碼構建它們的有序數組:

const struct entity_info entities[] = { 
{ "ENTITY1", 0x10001001 }, 
{ "ENTITY2", 0x10001002 }, 
/* and so on */ 
}; 

現在,您可以實現這樣一個高效的功能:

unsigned int get_entity_key(const char *entity_name); 

它也許可以在內部使用二進制搜索。

然後你需要做第二步,顯然。我不確定這些值的具體細節(他們如何以及何時可以改變);如果給定實體的「文件號」是固定的,那麼它當然可以直接添加到entity_info結構中。

+0

是的,我需要兩個查找表,但我不想手動填充這兩個表。 – Anshul

+0

@Anshul當我在列表後面說「處理源代碼」時,我試圖解釋說您需要一些程序從源代碼中提取這些信息,並建立表格。 – unwind

0

那麼,如何比較用戶輸入的字符串變量與宏名稱?

你不行。宏只在編譯時才存在(從技術上講,只在預編譯時,這在編譯期之前發生)。

我不會建議解決方案,直到我確信我正確理解您的方案(請參閱上面的註釋)。

1

宏程序名稱不存在於C程序中。預處理器已經用其替代值替換了宏名稱的每個實例。如果我沒有理解你的問題,你可能需要某種形式的查找表,如:

#define ENTITY1 0x10001001 
#define ENTITY2 0x10001002 
#define STR(x) #x 

struct lookup { char *name; unsigned value; } ; 
struct lookup mylut[] = { 
{ STR(ENTITY1), ENTITY1 } 
, { STR(ENTITY2), ENTITY2 } 
}; 

預處理將展開到:

struct lookup { char *name; unsigned value; } ; 
struct lookup mylut[] = { 
{ "ENTITY1", 0x10001001 } 
, { "ENTITY2", 0x10001002 } 
}; 

,你可以用它來查找字符串文字。

相關問題