将数组转换为函数参数

标签 c arrays function arguments variadic

我在全局注册表中注册函数。一个函数可以有多个参数。我可以从注册表中注册并调用它们。 这是我用于理解注册表的单元测试之一。

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;
}

到目前为止,这对我来说效果很好。但这是我找不到好的解决方案的部分。从行解析器我得到 token 。第一个应该是命令,后面的标记是参数。如果我有固定长度的参数,那么我不会有任何问题,但是我如何构造一个函数或宏来处理可变数量的标记,以将它们作为参数传递给函数?

这是我到目前为止所拥有的:

    // 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)。

函数的原型(prototype)是:

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

因为我可以定义一个宏并计算_VA_ARGS_,或者数组并对 1, 2, 3, 4, … 参数执行 if-else,但这对我来说似乎有点困惑。 必须有更好的方法将数组转换为参数列表。

最佳答案

将数组和数组中的项目数作为参数传递给被测试的函数。有什么理由让事情变得更加复杂吗?

请记住,传递给函数的数组实际上是指向数组中第一项的指针。

所以,如果你有:

// 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 :(" );

如果有任何不清楚的地方请询问...

关于将数组转换为函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19642885/

相关文章:

JavaScript:用于查找链表节点的递归函数返回错误的节点

c - 如果 DB2 中存在当月和上个月的记录,如何选择它?

C99 特定的 scanf 说明符不适用于 GCC 3.3.2——为什么不呢?

arrays - 删除零然后垂直折叠矩阵

c# - 避免随机重复

php - 如何使用 PHP 和 MySQLi 对照另一个多维数组检查一个多维数组值并根据结果更新批量数据?

c++ - MPI:Waitany 对 ibcast 调用没有反应

c++ - 涉及逻辑与 (&&) 的复杂表达式

python - iPython - Debug模式下的库函数帮助

javascript - 我可以使用 Function.bind 保留默认值吗?如果没有,为什么?