1

埋め込みシステムで実行する C コードを生成していますが、生成したいコードには多数のパラメーターを持つ関数の呼び出しが含まれています。これらのパラメーターの数は、関数を生成するときに常にわかっており、常に多数の入力配列と出力配列で構成されています。

現在のバージョンのコードでは、生成した C コードに次の形式の関数が含まれています。

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

この場合、3 つの入力配列と 2 つの出力配列があります。ただし、一般に、入力配列と出力配列の数は、数百または数千のように非常に大きくなる可能性があります。コードは人間が読むことを意図していないことに注意してください。

ここで、C 標準では最大 127 個の関数パラメーターのサポートのみが保証されていることを知りました。さらに、生成されたコードが組み込みシステムの厳密なコーディング標準に準拠することも望んでおり、ジェット推進研究所の C コードのコーディング標準では最大 6 つのパラメーターしか許可されていません。

では、最も効率的な方法で最大 6 つの関数パラメーターを使用して上記のコードを書き直すにはどうすればよいでしょうか? コードの読みやすさではなく、実行速度のみに関心があることに注意してください。

私の最初のアイデアは、上記の関数を次のように処理することです。

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

次に、このコードを次のように呼び出します (スレッドの安全性は問題ではありません)。

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

これは良い考えですか?他のより効率的な代替手段はありますか?

4

2 に答える 2

2

ソリューションよりも少し効率的なのは、単一のポインターを介してすべてのパラメーターにアクセスできることです。これは、構造体で行うことができ、さまざまな型の引数も処理できます。

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 ...
}
于 2013-07-04T18:34:18.483 に答える
0

あなたはよくやっていると思います。要件に合った配列

于 2013-07-04T17:47:28.367 に答える