2013-10-28 148 views
0

我在全局註冊表中註冊函數。一個函數可以有多個參數。我可以註冊並從註冊表中調用它們。 這是我的單元測試之一,瞭解註冊表。將數組轉換爲函數參數

void *a_test_function_d(int a, char *b){ 
    printf("*** c_test called\n"); 
    isRunD = a; 
    testChar = b; 
    return NULL; 
} 

TEST(testWithMultibleArguments) { 
isRunD = 0; 
testChar = ""; 

add_command(a_test_function_d); 
assertEquals(1, avl_tree_count(command_registry)); 

exec_command("a_test_function_d", 42, "test"); 
assertEquals(42, isRunD); 
assertEquals("test", testChar); 

avl_tree_free(command_registry); 
    command_registry = NULL; 
} 

這對我來說工作到目前爲止。但是,我無法找到一個好的解決方案。從一個線解析器我得到令牌。第一個應該是命令,下面的標記就是參數。如果我有一個固定長度的參數,比我沒有任何問題,但我怎樣才能構造一個函數或宏來處理一個變量的標記作爲參數傳遞給函數?

這是我到目前爲止有:

// split lines into tokens 
    char *token; 
    token = strtok(linebuffer," "); 
    if (token) { 
     if (has_cammand(token)) { 

      // HOW TO PUT ARGS from strtok(linebuffer," ") to FUNCTION.... 

      exec_command(token /* , a1, a2, a3 */); 
     } else { 
      uart_puts("Command not found.\n"); 
     } 
    } 

我行緩衝區是char *和可以看起來像:

find honigkuchen 
set name peter 

(從用戶輸入交互的shell來)。

的函數的原型將是:

void *find(char *); 
void *set(char *, char *); 

引起我可以定義一個宏和計數_VA_ARGS_,或陣列和做的if-else 1,2,3,4,...參數,但這對我來說似乎有點混亂。 必須有一個更好的方法來將數組轉換爲參數列表。

回答

1

將數組和項目數作爲參數傳遞給被測函數。是否有理由使這一過程複雜化?

請記住,傳遞給函數的數組實際上是指向數組中第一個項的指針。

所以,如果您有:

// Prototype for test function: 
bool testFunction(char *items, int itemCount); 

char items[10]; 
int itemCount = 0; 

// Get items from where ever 
items[0] = 'a'; 
items[1] = 'r'; 
items[2] = 'r'; 
items[3] = 'a'; 
items[4] = 'y'; 

itemCount = 5; 

// Assume testFunction returns true if the test succeeds, else false 
if(testFunction(items /*or &items[0] to make it more clear*/, itemCount)) 
    puts("Success!"); 
else 
    puts("Failure :("); 

問吧,如果有不清楚的地方......

+0

這可能是一個很好的解決方案確實如此。但我堅持void fn(char *)的原型,或void fn(char *,char *),...可以有0..n個參數。這是我無法改變的唯一部分。因爲我可以提出一個建議,並將其限制爲8個參數。這就夠了。我貪婪地扔了一堆功能,最多看到5個參數,所以8就夠了。我可以想象的唯一解決方案是寫一個宏並計算參數,然後調用fn(a),否則2:fn(a,b),否則3,fn(a,b,c)。但是..呃,這感覺不對。改變fn的定義對我來說不是一個解決方案:-( –