【问题标题】:Passing a large but known number of arguments to a C function将大量但已知数量的参数传递给 C 函数
【发布时间】:2013-07-04 17:44:10
【问题描述】:

我正在生成 C 代码以在嵌入系统上运行,并且我想要生成的代码包含对具有大量参数的函数的调用。当我生成函数时,这些参数的数量总是已知的,它们总是由许多输入和输出数组组成。

在我当前版本的代码中,我生成的 C 代码包含以下形式的函数:

void f(const double* x0, const double* x1, const double* x2, double* r0, double* r1);

在这种情况下,我有 3 个输入数组和 2 个输出数组。然而,一般来说,输入和输出数组的数量可能非常大,如数百或数千。请注意,该代码不适合人类阅读。

现在,我了解到 C 标准 only guarantees support for up to 127 function parameters。此外,我还希望我生成的代码符合嵌入式系统的严格编码标准,我已经看到Jet Propulsion Laboratory's coding standard for C-code 最多只允许 6 个参数。

那么,我怎样才能以最有效的方式用最多 6 个函数参数重写上面的代码呢?请注意,我只对执行速度感兴趣,而不是代码可读性。

我的第一个想法是将上面的函数处理如下:

void f(const double* x[], double* r[]);

然后按如下方式调用这段代码(线程安全不是问题):

static const double* x[] = {x0, x1, x2};
static double* r[] = {r0, r1};
f(x,r);

这是个好主意吗?还有其他更有效的替代方案吗?

【问题讨论】:

  • 确实,使用数组似乎是自然而然的答案。
  • 参数是否总是相同的,还是之前计算的?你可以使用静态指针组吗?
  • @jeb 数组本身保存在静态内存中,但(输入)数组的内容是在之前计算的。

标签: c embedded code-generation


【解决方案1】:

比您的解决方案更有效的是能够通过单个指针访问所有参数,您可以使用结构来做到这一点,结构也可以处理不同类型的参数:

typedef struct
{
    const double* in[3];
    double* out[2];
} MyFuncArgs;

MyFuncArgs myFuncArgs = { { x0, x1, x2 }, { r0, r1 } };
void myFunc(MyFuncArgs*);
myFunc(&myFuncArgs); 
...
void myFunc(MyFuncArgs* args)
{
     // do stuff with args->in[...], put results in args->out[...].
}

或者:

typedef struct
{
    const double *in0, *in1, *in2;
    double *out0, *out1;
} MyFuncArgs;

MyFuncArgs myFuncArgs = { x0, x1, x2, r0, r1 };
void myFunc(MyFuncArgs*);
myFunc(&myFuncArgs); 
...
void myFunc(MyFuncArgs* args)
{
     // do stuff with args->in0 ..., put results in args->out0 ...
}

【讨论】:

  • 好建议,尤其是替代版本。我会接受这个作为我的答案。谢谢!
【解决方案2】:

我认为你做得很好。数组满足您的要求

【讨论】:

    猜你喜欢
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 2014-03-08
    • 1970-01-01
    • 2015-08-22
    • 2012-01-13
    相关资源
    最近更新 更多