1

私はこの機能を持っています:

void print(THashEntry *entry, ...)
{
    va_list parameters;

    va_start(parameters, entry);

    while (true)
    {
        THashEntry *currentEntry = va_arg(parameters, THashEntry *);
        if (!currentEntry)
        {
            break;
        }

        printf("%s\n", currentEntry->value);
    }



 va_end(parameters);
}

これらのエントリのアドレスを関数に渡し、メンバーの「値」にアクセスして出力したいと思います。

ただし、va_arg を介してパラメーターを取得しようとすると、最初からではなく 2 番目のパラメーターが返され、サイクルの別のループが始まると、セグメンテーション違反になります。

4

4 に答える 4

2

John Kugelman が彼の回答で述べているように、printf/sprintf に可変数の引数を渡すためのいくつかの良い方法があります:-

 void Error(const char* format, ...)
 {
  va_list argptr;
  va_start(argptr, format);
  vfprintf(stderr, format, argptr);
  va_end(argptr);
 }
于 2012-11-25T17:46:01.293 に答える
0

かなりの数の答えがあるようですが、個人的には、va_list 内の引数の数を動的にカウントする優れた方法を見つけたことがありません。

とはいえ、それを回避する方法はいくつかあります。

  • qrdl で指摘されているように、NUMARGS(...) マクロを使用します。
  • main と同様に、引数の数を関数に渡します。void print(int numArgs, MyEntry *entry, ...)
  • NULL で終了するリストを使用する

後者はたまたま私の個人的な好みです。なぜなら、リストの最後を捉える方法に対する私の(そしてあなたのように見える)本能と一致する傾向があるからです。下記参照:

 #import <stdarg.h>

 typedef struct MyEntry {
     int a;
     int b;
 } MyEntry;

 void print(int numArgs, MyEntry *entry, ...) {

     va_list parameters;

     va_start(parameters, entry);

     MyEntry *m;
     for ( m = entry; m != NULL; m = va_arg(parameters, MyEntry *))  {        
         printf("%d\n", (int)m->a);
     }

     va_end(parameters);
 }

 int main(int argc, char *argv[]) {

     MyEntry entry = { 10, 20 };
     MyEntry entry2 = { 30, 40 };
     MyEntry entry3 = { 50, 60 };
     MyEntry entry4 = { 70, 80 };
     MyEntry entry5 = { 90, 100 };

     print(2, &entry, &entry2, &entry3, &entry4, &entry5, NULL);
     return 1;
 }

ハッピーコーディング!

于 2012-11-26T00:08:54.923 に答える
0

あなたのデザインに突っ込んで申し訳ありませんが、これは使用する代わりになるかもしれません

 struct abc {
    int a;
    char b[10];
 };

 void f(int size, abc* a) {
    for (int i = 0; i < size; i++) {
    abc x = a[i];
    }
 }

int _tmain(int argc, _TCHAR* argv[])
{
abc *arrAbc = new abc[10];
for (int i = 0; i < 10; i++) {
    arrAbc[i].a = 0;
}
f(10, arrAbc);
}
于 2012-11-25T18:00:59.547 に答える
0

va_argNULL引数リストの最後に到達すると返されません。言うようman va_argに:

ランダムなエラーが発生します

したがって、それを回避するには、print関数に引数の数を渡すか、ターミネータを終了する必要があります。

コンパイル時に引数の数を自動的に計算するには、マクロを使用できます

#define NUMARGS(...)  (sizeof((int[]){__VA_ARGS__})/sizeof(int))

この回答で詳細を参照してください

于 2012-11-25T17:55:17.567 に答える