我在全球注册局注册功能。一个函数可以有多个参数。我可以在注册表中注册并调用它们。 这是我理解注册表的单元测试之一。
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_
,或者数组并在1,2,3,4 ......参数上做一个if-else,但这对我来说似乎有些混乱。
必须有更好的方法将数组转换为参数列表。
答案 0 :(得分: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 :(" );
询问是否有任何不清楚的地方......