- ベストアンサー
関数の戻り値がこうなる理由が分かりません。
かなり簡単なプログラムだと思いますが、関数内で出力した場合と、呼び出し側で出力した場合で値が異なります。理由が分からないので教えていただけますか? #include <stdio.h> #include <stdlib.h> Table(int num, double ltable) { double temp[] = { 0.99852, // 1 0.99410, // 2 0.98677 // 3 }; ltable=temp[num]; printf("%f\n",ltable); } main (int argc, char *argv[]) { int num ; double ltable ; num=1; Table(num, ltable); printf("%f\n",ltable); } 実行結果 0.994100 0.000000
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
がるです。 メインの質問から少々外れてしまって恐縮ですが。 > void Table(・・・・ > とありますが、voidとはどのようなときに使うのでしょうか? 元の関数が「復帰値を何も返していない」ので、voidにしてみました。 復帰にvoidと書くのは、明示的に「この関数の復帰値はない」と宣言する手法です。 似たようなパターンで「引数がない」事を明示的にする場合、 int function(void) という風な記述をします。これは「引数なし、復帰値はint」であることを明示的にあらわします。
その他の回答 (3)
- edomin
- ベストアンサー率32% (327/1003)
しばらく携わっていなかったのではずしているかも知れませんが、Table関数を呼び出すときにltableのアドレスを参照して渡さないとltableには何も入力されないと思います。 この場合は、 #include <stdio.h> #include <stdlib.h> double Table(int num) { double temp[] = { 0.99852, // 1 0.99410, // 2 0.98677 // 3 }; printf("%f\n",temp[num]); return(temp[num]); } main (int argc, char *argv[]) { int num ; double ltable ; num=1; ltable = Table(num); printf("%f\n",ltable); } の方が判りやすいと思いますが・・・
補足
早速のご回答ありがとうございます。 例文では、戻り値が一つのためreturnの方が簡単に見えるのですが、実際は戻り値が複数あるため、構造体宣言が面倒くさいので、構造体でなく、もっと簡単にできないかぁ、と思った次第です。 複数の戻り値があった場合、さらに簡素な記述方法があり、教えていただけたら幸いです。
- Chronos198
- ベストアンサー率30% (105/349)
main()内で宣言したltable変数と、 Table()内で宣言されているltable変数は別物だからです。 「手元の袋と同じ名前で同じ形で同じ中身の袋を作って渡した。その中に物を入れたのに、手元の袋は空っぽだぞ?」 といった具合です。 プログラム的な言い方をすると「値渡しをしているから」です。 解決方法は「手元の袋の場所を渡して、そこに入れてもらう」、プログラム的には「参照渡しにする」です。
- galluda
- ベストアンサー率35% (440/1242)
がると申します。 取り合えずまず ・引数にデータを格納して戻したいならポインタを渡す 必要があります。 お書きになっているプログラムですと、関数をcallするところの double ltable と関数で受け取っているdouble ltable は別物になりますので、いくら値を設定したところで、call元に値が設定されることはありえません。 関数を void Table(int num, double *ltable) とするか、或いはいっそ double Table(int num) として、復帰値に持ってきたほうがよいように思われます。 なお、前述の場合は Table(num, <able); のようにcallする必要がありますし、後述の場合は ltable = Table(num); のようにcallする必要があります。 で、値が異なる理由ですが。 Table 関数内では指定された挙動どおりなので特に解説は必要ないか、と。 mainの double ltable ; は、このプログラムですと「誰も値を設定していない」ので。C及びC++において、設定されていない、宣言されただけの変数の値は「不定」です。今回はたまたま、アサインしたメモリ上が0だったのでしょう。 以上になりますが、また何か不明な点などありましたらお気軽に。
お礼
早速のご回答ありがとうございます。 2つ提案していただいた、後者の方は今までやってきており問題なく動作しおりますので、前者の方を質問させえていただきます。 また、異なる理由についても理解できました。 質問ですが、教えていただいたとおりに修正を行うと、関数中の ltable=temp[num]; にて incompatible types in assignment; というエラーになってしまいます。ここも何か修正が必要でしょうか? あと、 void Table(・・・・ とありますが、voidとはどのようなときに使うのでしょうか? ”ポインタ渡しのような、型が指定されてない場合”ってことでしょうか?
補足
自己レスです。 関数内のltableを*ltabeにすることで解決しました。
お礼
何度もご丁寧にありがとうございました。 理解できました。