• ベストアンサー

参照による呼び出し

参照による呼び出しで3つの整数を大きい順に並び替えるという プログラムで、 #include<stdio.h> void change(int *x,int *y,int *z);/       main(){ int a,b,c; scanf("%d %d %d",&a,&b,&c); printf("入力データ:a=%d,b=%d,c=%d\n",a,b,c); change(&a,&b,&c); printf("入れ替え後:a=%d,b=%d,c=%d\n",a,b,c); return(0); } void change(int *x,int *y,int *z){ if(*x>*y){ *a=*x; *c=*y; } else{ *a=*y; *c=*x; } if(*z>*a){ *b=*a; *a=*z; } else if(*z>*c){ *b=*z; } else{ *b=*c; *c=*z; } } のように作ったのですが、zの値が一度も使われていないとエラーが 出てしまいます。どこをどう直せばいいか教えてください。 お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.4

>使って並び替えて、最後に*a,*b,*cに代入するということですか? やはり恐れていたように参照渡し自体を理解できていないように見受けられます。 変数 a, b, c は main() のものです。change() には渡りません。つまり使えません。 change(&a, &b, &c) と関数を呼び出すことで、変数 a, b, c のアドレスがコピーされて change() に渡ります。 change() の中ではそのアドレスを手掛りにして、main() の持っている変数にアクセスすると思って下さい。 change() は void change(int* x, int* y, int* z) と宣言されているので、上述した変数 a, b, c のアドレスは コピーされて x, y, z に格納されています。 なので change() の中で int tmp; tmp = *x; *x = *y; *y = tmp; とすると、x, y の指している先の変数領域、つまり main() の持っている a, b の中身を入れ替えることができます。 あとは適当にどうぞ。

oiwae
質問者

お礼

できました! 皆さんどうもありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

changeの中で使っている変数 a,b,cはグローバル変数にもローカル変数にも定義がありません この3つに関するコンパイルエラーが発生していると思います 変数のスコープ(有効範囲)を確認しましょう これが原因で if( *z > *a )などzに関する式が評価されたいため > 警告 W8057 課題12-(2).c 36: パラメータ 'z' は一度も使用されない(関数 change ) 警告が表示されます ただ警告よりコンパイルエラーを先に解決するものですよ

すると、全ての回答が全文表示されます。
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

>zの値が一度も使われていないとエラーが そのような瑣末なワーニングはさて置き、change() の中で突如変数 a, b, c が使用されているのを直しましょう。 善し悪しは別として、change() に渡された x, y, z の参照先を変更する予定なのでしょう?

oiwae
質問者

補足

a,b,cが使用されているのを直すというのは、 change()の中で別の変数(big,mid,sml)みたいなのを 使って並び替えて、最後に*a,*b,*cに代入するということですか?

すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

> zの値が一度も使われていないとエラーが 他のエラーは修正済ですか?

oiwae
質問者

補足

警告 W8057 課題12-(2).c 36: パラメータ 'z' は一度も使用されない(関数 change ) *** 3 errors in Compile *** *** コンパイル終了 *** と出るので、他のエラーは修正できていないと思いますが どこがいけないかわかりません。

すると、全ての回答が全文表示されます。

専門家に質問してみよう