0

一連のintを加算し、合計を返す単純な可変個引数関数を作成しています。私はそれがどのように機能するかを理解するのに少し問題があり、私のコードは正しい方向に進んでいると感じていますが、私のコードは機能していないようです。(以下に投稿)この関数の仕様は、少なくとも1つのパラメーターを取り、最後のパラメーターは常にゼロであるというものです(メインで呼び出されるように)。また、自分のマシンに基づいて、探している出力が必ずしも得られるとは限らないと言われました。これは、ご想像のとおり、状況をさらに複雑にします。Sum()関数を修正するための支援をいただければ幸いです。

編集:これは、stdarg.hヘッダーを使用せずに実行されることになっているため、va_arg関数は使用されません。

int Sum(int a, ... ) {
   int sum = 0, *addy = &a;

   while (*addy) {
      sum += *addy;
      addy += sizeof(a);
   }

   return sum;
}


int main() {
   printf("%d %d %d %d\n", Sum(0), Sum(3, 5, 6, 7, 0),
   Sum(7, 2, 42, 3, 5, -4, 0), Sum(-1, 9, 12, 123, -213, 42, 7, 2, 0));
}
//Expected output: 0 21 55 -19
//My output: 0 32770 32770 32776
4

4 に答える 4

3

(のように)intポインターに数値を追加すると、追加した数値にaddy += sizeof(a)、ポインターが宣言されているタイプ(この場合)のサイズが自動的に乗算されますint。これを修正するには、

addy += 1;

代わりは。ただし、この方法の代わりに可変個引数マクロを使用することをお勧めします。これらのマクロはより明確で、エラーが発生しにくくなっています。

于 2013-01-22T05:04:01.627 に答える
1

変数引数の場合はva_startva_end関数を使用する必要があります。便利なことを願っています。

http://www.gnu.org/software/libc/manual/html_node/Variadic-Example.html#Variadic-Example

于 2013-01-22T05:04:45.173 に答える
1

これを確認していただけますか

int Sum(int a, ... ) {
 int sum = 0, *addy = &a;

while (*addy) {
  sum += *addy;
  addy ++;
}

return sum;
}


int main() {
   printf("%d %d %d %d\n", Sum(0), Sum(3, 5, 6, 7, 0),
  Sum(7, 2, 42, 3, 5, -4, 0), Sum(-1, 9, 12, 123, -213, 42, 7, 2, 0));
}

覚えておくべきポイントは、ポインター操作です。ポインターに追加する数値は、ポインターが指している型のサイズで乗算されます。したがって、次の要素を取得するには、ポインタaddyをインクリメントするだけで十分です。

于 2013-01-22T05:08:43.440 に答える
0
 #include <stdarg.h>
 #include <stdio.h>

 int
 add_em_up (int count,...)
 {
   va_list ap;
   int i, sum;

   va_start (ap, count);         /* Initialize the argument list. */

   sum = 0;
   for (i = 0; i < count; i++)
     sum += va_arg (ap, int);    /* Get the next argument value. */

   va_end (ap);                  /* Clean up. */
   return sum;
 }

 int
 main (void)
 {
   /* This call prints 16. */
   printf ("%d\n", add_em_up (3, 5, 5, 6));

   /* This call prints 55. */
   printf ("%d\n", add_em_up (10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));

   return 0;
 }
于 2014-08-07T15:17:18.943 に答える