• ベストアンサー

関数の戻り値がこうなる理由が分かりません。

かなり簡単なプログラムだと思いますが、関数内で出力した場合と、呼び出し側で出力した場合で値が異なります。理由が分からないので教えていただけますか? #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

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

  • ベストアンサー
  • galluda
  • ベストアンサー率35% (440/1242)
回答No.4

がるです。 メインの質問から少々外れてしまって恐縮ですが。 > void Table(・・・・ > とありますが、voidとはどのようなときに使うのでしょうか? 元の関数が「復帰値を何も返していない」ので、voidにしてみました。 復帰にvoidと書くのは、明示的に「この関数の復帰値はない」と宣言する手法です。 似たようなパターンで「引数がない」事を明示的にする場合、 int function(void) という風な記述をします。これは「引数なし、復帰値はint」であることを明示的にあらわします。

lts107
質問者

お礼

何度もご丁寧にありがとうございました。 理解できました。

その他の回答 (3)

  • edomin
  • ベストアンサー率32% (327/1003)
回答No.3

しばらく携わっていなかったのではずしているかも知れませんが、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); } の方が判りやすいと思いますが・・・

lts107
質問者

補足

早速のご回答ありがとうございます。 例文では、戻り値が一つのためreturnの方が簡単に見えるのですが、実際は戻り値が複数あるため、構造体宣言が面倒くさいので、構造体でなく、もっと簡単にできないかぁ、と思った次第です。 複数の戻り値があった場合、さらに簡素な記述方法があり、教えていただけたら幸いです。

回答No.2

main()内で宣言したltable変数と、 Table()内で宣言されているltable変数は別物だからです。 「手元の袋と同じ名前で同じ形で同じ中身の袋を作って渡した。その中に物を入れたのに、手元の袋は空っぽだぞ?」 といった具合です。 プログラム的な言い方をすると「値渡しをしているから」です。 解決方法は「手元の袋の場所を渡して、そこに入れてもらう」、プログラム的には「参照渡しにする」です。

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.1

がると申します。 取り合えずまず ・引数にデータを格納して戻したいならポインタを渡す 必要があります。 お書きになっているプログラムですと、関数をcallするところの double ltable と関数で受け取っているdouble ltable は別物になりますので、いくら値を設定したところで、call元に値が設定されることはありえません。 関数を void Table(int num, double *ltable) とするか、或いはいっそ double Table(int num) として、復帰値に持ってきたほうがよいように思われます。 なお、前述の場合は Table(num, &ltable); のようにcallする必要がありますし、後述の場合は ltable = Table(num); のようにcallする必要があります。 で、値が異なる理由ですが。 Table 関数内では指定された挙動どおりなので特に解説は必要ないか、と。 mainの double ltable ; は、このプログラムですと「誰も値を設定していない」ので。C及びC++において、設定されていない、宣言されただけの変数の値は「不定」です。今回はたまたま、アサインしたメモリ上が0だったのでしょう。 以上になりますが、また何か不明な点などありましたらお気軽に。

lts107
質問者

お礼

早速のご回答ありがとうございます。 2つ提案していただいた、後者の方は今までやってきており問題なく動作しおりますので、前者の方を質問させえていただきます。 また、異なる理由についても理解できました。 質問ですが、教えていただいたとおりに修正を行うと、関数中の ltable=temp[num]; にて incompatible types in assignment; というエラーになってしまいます。ここも何か修正が必要でしょうか? あと、 void Table(・・・・ とありますが、voidとはどのようなときに使うのでしょうか? ”ポインタ渡しのような、型が指定されてない場合”ってことでしょうか?

lts107
質問者

補足

自己レスです。 関数内のltableを*ltabeにすることで解決しました。

関連するQ&A