10

私はこのように見えるいくつかのコードを持っています:

uint8_t activities[8];
uint8_t numActivities = 0;
...
activities[numActivities++] = someValue;
...
activities[numActivities++] = someOtherValue;
...
switch (numActivities)
{
   0 : break;
   1 : LogEvent(1, activities[0]);  break;
   2 : LogEvent(1, activities[0], activities[1]);  break;
   3 : LogEvent(1, activities[0], activities[1], activities[2]);  break;
   // and so on
}

ここで、LogEvent()はvarargs関数です。

これを行うためのより洗練された方法はありますか?


[更新]@0x69他への謝罪。LogEvent()が配列をパラメータとして受け取れない場合が多いとは言いませんでした。ごめん。

4

2 に答える 2

4

引数を作成または操作する標準的な方法はなくva_args、別の関数に渡すこともできません(可変引数を操作する標準的な方法?Cプログラミング:変数引数リストを転送する)。の内部ルーチンにアクセスできるかどうかを確認したほうがよいでしょうLogEvent

于 2013-02-05T11:04:25.913 に答える
2

代わりに、intの配列といくつかのintへのポインタを渡します

#include <stdio.h>

void logevent(int n, int num, int *l) {
    int i;
    for (i=0; i<num; i++) {
        printf("%d %d\n",n,*(l++));
    }
    }

int main() {

    int activities[8];
    activities[0]=2;
    activities[1]=3;
    activities[2]=4;
    int num=3;
    int n=1;
    logevent(n,num, activities);
    printf("=========\n");
    n=2;
    activities[3]=5;
    num=4;
    logevent(n,num, activities);

}
于 2013-02-05T11:15:53.747 に答える