• ベストアンサー

void関数について

 void ranmotion(...,&esti,...);  というvoid関数を作りまして、 int main() {  int esti=0; .... ranmotion(...,esti,...); } を計算したとき、ranmotion(...,esti,...)の中ではesti=100とかと計算が出来ているのですが、main関数の中では、esti=0のままになってしまいます。どうすればesti=100などの計算結果をmain関数内に持っていくことができるのでしょうか?  ご教授お願いします。

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

  • ベストアンサー
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.5

これはCですかC++ですか? 開発言語を書いてください。 C言語には参照渡しはありません。 概念的に同じようなことは実装できますが、 変数であろうとポインタであろうと、 すべて値渡しで実装されます。 #ポインタの場合はアドレスを #値渡しすることでその値を参照させます >参照渡しを使わず、void関数内の引数を >計算結果に変換させることはできるのでしょうか? 上記の通りCには、そもそも参照渡しがありませんが、 ポインタを渡すことでその参照された値を取り出すことも、 設定することも可能です。 #include <stdio.h> void hoge( int* p ) {  if( p ) *p = 100; } int main( int argc, char* argv[] ) {  int huga=0;  printf( "huga = %d\n", huga );  hoge( &huga );  printf( "huga = %d\n", huga );  return 0; } #全角は半角に。

spitzer3
質問者

お礼

>これはCですかC++ですか? 開発言語を書いてください。 C++で開発してます。  ご指摘したされたようにポインタと&を使って関数を作ったところ、計算結果が関数の出力に反映されました。  ご回答ありがとうございます。

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

その他の回答 (5)

  • arain
  • ベストアンサー率27% (292/1049)
回答No.6

No.3です。 > 出力がいっぱいあるので、void以外の型で出力するのは大変だと思いまして。 すみませんが内容がよく理解できません。 「出力」といっているのは何処のことですか? それと、回答をよく読んでいただけましたか? >自作なら、「グローバル変数を使えば……」となりますが、 >それをやるくらいなら参照渡しか計算結果を戻り値とした方がいいです。 最後にも書きましたが、なぜ参照渡しはだめなのですか? グローバル変数は、きっちりと使用方法を決めないと複数で参照変更を行うことができるため非常に危険でオブジェクト志向としてもよくはありません。 そもそも、どういったことを行いたいための関数なのですか? 今までの返答を見ていると、間違った思い込みで無駄なことを行おうとしているようにしか思えません。 ・開発環境(c/c++) ・入力(引数で渡したい)データ ・結果として関数から戻したいデータ がどういったものかきっちりと説明してください。

spitzer3
質問者

お礼

 No.5の方のプログラムのように入力データが関数で計算したことを入力データと同じ変数に出力してやりたかったのです。  ご回答ありがとうございました。

すると、全ての回答が全文表示されます。
  • php504
  • ベストアンサー率42% (926/2160)
回答No.4

> 参照渡しを使わず、void関数内の引数を計算結果に変換させることはできるのでしょうか? できません!

spitzer3
質問者

お礼

 ご回答ありがとうございました。

すると、全ての回答が全文表示されます。
  • arain
  • ベストアンサー率27% (292/1049)
回答No.3

すみませんが確認です。 No.1 > すみません。プロトタイプ宣言はしておりません。ヘッダーをインクルードしています。 > ただ、関数の引数を計算結果に変換しようとしていて&が出てきたという感じです。 No2. > 参照渡しを使わず、void関数内の引数を計算結果に変換させることはできるのでしょうか? からだと、ranmotion()は自作しているのではなく、何らかの提供されているライブラリの関数を使用しているともとれるのですが? であれば、どう頑張っても無理です。 解決方法は ・提供元に関数を追加/変更してもらう ・提供元にソースを提供してもらい変更する ・同等の機能を持つ関数を自作する くらいです。 自作なら、「グローバル変数を使えば……」となりますが、それをやるくらいなら参照渡しか計算結果を戻り値とした方がいいです。 voidでなければいけなかったり、参照渡しがいけない理由があるのですか?

spitzer3
質問者

補足

>voidでなければいけなかったり、参照渡しがいけない理由があるのですか? 出力がいっぱいあるので、void以外の型で出力するのは大変だと思いまして。  >自作なら、「グローバル変数を使えば……」となりますが、それをやるくらいなら参照渡しか計算結果を戻り値とした方がいいです。 グローバル変数を使うという方法があるのですか。調べてみたいと思います。

すると、全ての回答が全文表示されます。
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

参照渡し(C++の機能)を使おうとしていますか? #include <stdio.h> void ranmotion(int& esti) { esti = 100; } int main() { int esti = 0; ranmotion(esti); printf("%d",esti); return 0; } このようにすればmain内でestiは100になっています。

spitzer3
質問者

補足

 参照渡しを使わず、void関数内の引数を計算結果に変換させることはできるのでしょうか?

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

それは、戻り値がvoidかどうかという話ではなく、 関数に渡す引数の型が合っていない、という話です。 >  void ranmotion(...,&esti,...); これはプロトタイプ宣言ですか?だとすると、 &esti ではなくて *esti ではありませんか?そして、当該関数を呼び出すときに ranmotion(...,&esti,...); と書かねばならないのではありませんか?

spitzer3
質問者

補足

 すみません。プロトタイプ宣言はしておりません。ヘッダーをインクルードしています。  ただ、関数の引数を計算結果に変換しようとしていて&が出てきたという感じです。

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

関連するQ&A