あるC言語のソースを見ていたら、va_list型の引數を持つ函數がありました。
そのソースは複雜なので、質問するために以下のソースを作りました。
(ですから、このプログラムはじつよう性もないし、無意味なこともしています。)
#include <stdio.h>
#include <stdarg.h>
int sum_func1(int sw1, va_list ap1)
{
int sum1 = 0;
va_start(ap1, sw1);
sum1 += va_arg(ap1,int);
sum1 += va_arg(ap1,int);
va_end(ap1);
return(sum1);
}
int sum_func0(int sw0, ...)
{
int sum0;
va_list ap0;
int a0, b0;
va_start(ap0, sw0);
a0=va_arg(ap0, int);
b0=va_arg(ap0, int);
printf("sum_func0です。これから%dと%dを足します。\n", a0, b0);
sum0 = sum_func1(sw0, ap0);
va_end(ap0);
return(sum0);
}
int main(void)
{
printf("1 + 2 = %d\n", sum_func0(0,1,2));
return 0;
}
やっていることは、結局のところ、1と2を足してその結果を表示しているだけです。
このプログラムは動かすことはできますが、表示される足し算の結果がおかしいです。
sum_func0の中で 1(a0)と2(b0)は既にva_argを使って取得しています。
その後、sum_func1の中で、再び この1と2を取得しようとしているのですが、
このようなことは可能でしょうか。
可能ならば、どのように修整すればよいのでしょうか。
これが可能か否かが元のソースの讀み方に影響するのです。
最初に述べたように、va_list型の引數を持つ函數についての質問なので、
va_list型の引數を使わないような修整方法ですと、
期待するものではありません。
No.3ベストアンサー
- 回答日時:
あと、sum_func1のなかの、va_start、va_endも不要ですね。
No2、No3
これはおもしろいですね。
もちろん、回答としては正解です。
これも單純化すると、次のような仕組みになっているんですね。
int sum_func0(int sw0, ...)
{
va_list ap0,ap1;
va_start(ap0, sw0);
ap1=ap0;
va_arg(ap0, int);
va_arg(ap0, int);
va_arg(ap1, int);
va_arg(ap1, int);
va_end(ap0);
・
・
}
va_list型の變數が2つあるのがポイントですね。
これもap1から引數を取り出す部分を函數にすれば、質問に適しますね。
No.2
- 回答日時:
>va_start(ap0, sw0);
>a0=va_arg(ap0, int);
>b0=va_arg(ap0, int);
va_argマクロは、ap0の内容を書き換えます。
そのため、sum_func1に正しい引数がわたっていません。
va_list ap0, ap1;
va_start(ap0, sw0);
ap1 = ap0;
・
・
・
sum0 = sum_func1(sw0, ap1);
とすればsum_func1()で問題なく呼び元からの可変引数を利用できます。
No.1
- 回答日時:
> sum_func0の中で 1(a0)と2(b0)は既にva_argを使って取得しています。
> その後、sum_func1の中で、再び この1と2を取得しようとしているのですが、
> このようなことは可能でしょうか。
va_start ~ va_end で囲めば、何回でも取得できるはずです。
以下に例を示します。
//int sum_func1(int sw1, va_list ap1)
int sum_func1(va_list ap1)
{
int sum1 = 0;
//va_start(ap1, sw1);
sum1 += va_arg(ap1,int);
sum1 += va_arg(ap1,int);
//va_end(ap1);
return(sum1);
}
int sum_func0(int sw0, ...)
{
int sum0;
va_list ap0;
int a0, b0;
va_start(ap0, sw0);
a0=va_arg(ap0, int);
b0=va_arg(ap0, int);
printf("sum_func0です。これから%dと%dを足します。\n", a0, b0);
//sum0 = sum_func1(sw0, ap0);
va_end(ap0);
va_start(ap0, sw0);
sum0 = sum_func1(ap0);
va_end(ap0);
return(sum0);
}
なるほど~、と思いました。
ありがとうございました。
これは單純化して可變數個引數關係のみを拔き出して書くと、
次のように、va_start、va_endの組が、【入れ子にならずに】ならんでいますね。
int sum_func0(int sw0, ...)
{
va_list ap0;
va_start(ap0, sw0);
a0=va_arg(ap0, int);
b0=va_arg(ap0, int);
va_end(ap0);
va_start(ap0, sw0);
a0=va_arg(ap0, int);
b0=va_arg(ap0, int);
va_end(ap0);
}
あとは2番目の「va_start・va_endの組」の内側が、
va_list型ap0を引數とする函數になっているだけですね。
ご回答が私の質問に對して正解であるのは言うまでもないですが、
私の疑問は入れ子にすることはできないのだろうか、
ということでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# C言語: ポインタ 5 2022/06/01 08:33
- C言語・C++・C# プログラミング実行後の表示される値を答えよ #include<stdio.h> void main( 7 2022/05/20 00:07
- C言語・C++・C# プログラミング実行後に表示される値を答えよ #include <stdio.h> void main 4 2022/05/28 10:20
- C言語・C++・C# プログラミングを教えて欲しいです。 配列aは、int a[9]={7,6,12,8,3,5,10,9 4 2022/12/19 23:27
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# Cのオブジェクトファイルの逆アセンブル 5 2023/05/13 01:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
市松模様
-
数字列を3桁ごとにカンマで区切...
-
PowerShellがうまくいかない
-
C言語初心者です、、、お助けく...
-
C言語 エラーの原因がわからな...
-
c言語の配列を使ってサイコロを...
-
因数分解を行うプログラムについて
-
(マルチスレッド)_beginthrea...
-
acceptをalarmでタイムアウトさ...
-
【C++】関数ポインタの使い方
-
windows-findstrの正規表現を使...
-
このプログラミング誰か教えて...
-
質問項目をランダムで選択する...
-
エラー 添字が付けられた値が、...
-
並列プログラミングのπ計算につ...
-
c言語 プログラムのエラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
c++でテンプレートのコードでわ...
-
(int *)の意味
-
ラップ関数とはどんなものですか?
-
数字列を3桁ごとにカンマで区切...
-
c言語のリダイレクトによる円...
-
比較回数と交換回数表示について
-
実数の整数部,小数部の取得
-
if と配列の組み合わせ
-
構造体の勉強中です 合計点の高...
-
PowerShellがうまくいかない
-
c言語の配列を使ってサイコロを...
-
課題でつまってます・・・
-
C言語のサイコロシミュレート
-
エラー 添字が付けられた値が、...
おすすめ情報