• ベストアンサー

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% (2126/6288)
回答No.1

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

spitzer3
質問者

補足

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

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

関連するQ&A

  • int main(void)

    C言語の問題集をやっているのですが、 本にはmain関数の最初にint main(void)のような書き方が してあります。 学校ではmain() と習ったのですが、本には上のようにかいてあります。 どのように違うのでしょうか? というかmain関数のところに引数が入っている意味がわかりません。 どういうことがというと(void)ってなんですか? またint mainというのはint型の関数だと思うのですが、 なかではdouble型とかも使えます。 お願いします。

  • int main()、void main()、void main(void)、int main(void)

    今日、大学でC言語の講義の時間、先生が、 #include <stdio.h> void main(void){ } と宣言してプログラムを書くと教えていました。 main関数には、 main() void main() void main( void ) int main() int main( void ) と、人によりいくつかの描き方があったりします。 どれが本当は正しいのでしょうか? void mainはすべきではないとなんかの本で読んだのですが・・。

  • 戻り値を返す関数の前に(void)を付ける

    今日会社で 変数 = (void)戻り値のある関数 #具体的な例としては下記一例を参照 と、ソースで書かれているものがあったのですが、 コメント等では、 「戻り値を明示しないときに(void)を付けて使用する」 と、書いてあります。 戻り値のある関数の前で(void)を付けると、戻り値が明示されなくなるのでしょうか?? または、このような動作にはならないのでしょうか。 自分自身、ソースの内容をうる覚えになっておりますので、 確認をしながらアップしていきたいと思いますので、 宜しくお願い致します。 /*一例*/ ・num1とnum2を足した値を返す int PlusPoint(int num1 , num2); ・PlusPointの値を格納する int Sum ◇ソース◆ #include <stdio.h> #include "Plus.h" int main(void) { int Sum; Sum = (void)PlusPoint; if(Sum == 2) { printf("false"); exit(0); } printf("true"); return 0; } *PlusPoint関数は外部で定義されている *プロトタイプ宣言はPlus.hに定義されいるものとする

  • int型 void型について

    C初心者です。 「int main(voido)」や「void main(void)」がよくわかりません。 int、void、(void)とは返り値を返す、返さないということが理解できません。小学生でもわかる説明をしていただけないでしょうか? よろしくお願いいたします。 

  • int main(void) の意味について教えて下さい

     お早う御座います、Cの初心者です、宜しくお願いします。  最初にmain関数は、「int main(void)」という風に始まりますが 、main関数がstring型をとる場合とか、実際に他の関数から呼ばれる場合は有るのでしょうか。

  • 関数の引数をvoid*でキャストする

    最近見かけたCのプログラムで、関数の引数の型は void* なのですが、その関数を使うときに 引数をvoid*でキャストしていました。 例えば、 func ( (void*) p ); こういうことです。 私の知っている知識では、 void* と 任意の型のポインタは キャストなしに相互に代入可能です。 関数の引数でも、キャストは要らないものだと思っていました。 そうすると、引数を void* でキャストするのは無意味だと思うのですが、・・・ 違うのでしょうか。処理系によるとか。 逆に、関数の引数の型がchar*などで、渡すものが void* のときはどうなのでしょうか。 下のプログラムは、関数byte_orderの引数の型はvoid*ですが、int型へのポインタ( &a )を設定しています。私の環境では、コンパイルエラーも警告もないし、動作も正常です。 #include <stdio.h> #include <string.h> void byte_order(void *vp) { char char_array[4]; strncpy(char_array, vp, 4); printf("出力します:%x %x %x %x\n", char_array[0], char_array[1], char_array[2], char_array[3]); } int main(void) { int a = 0x12345678; byte_order(&a); return 0; } このプログラムは単なる一例であって、質問はバイトオーダに関するものではありません。 また、C言語の質問であって、C++ではありません。

  • 複数のアドレスを関数から取得したいのですが

    関数から複数のアドレスを取得したいのですが方法がわかりません。 間違いではありますがイメージとしてはこういうことが行いたいのですが。 void main(){   int *test1,*test2;   Test(test1,test2); } void Test(int *in_test1, int *in_test2){   int data1,data2;   data1 = 1;   data2 = 2;   in_test1 = &in_test1;   in_test2 = &in_test2; } 結果的にmain関数のtest1とtest2にTest関数のdata1とdata2のアドレスが入るようにしたいのです。 ご教授願います。

  • voidについて

    いつもお世話になってます。 最近プログラミングの授業に全然ついていけなくて、1から勉強しようと思ってます。 今回はvoidについて質問なのですが、たとえば下のようなプログラムがあるとします(あえてabcとcdfとxyzを使い分けています。) 数字を入力するとプロトタイプ宣言した関数で足して戻り値が答え(←日本語あってますか?)ってことですよね? 私はvoid関数についてあまり理解できていないので、void関数ではどのように数字が動いているかとどれを一致させなければいけないのかをabcdefxyzを使って詳しく解説していただきたいです。 あと関数の起動の仕方(←日本語あってますか?)も教えていただきたいです。      c=tasu(a,b); printf("%lg\n",c);という方法とか      tasu(a,b); ←これだけとか )   文章ぐだぐだで申し訳ないです。 どなたかおねがいいたします。   ) #include<stdio.h> void tasu(double x, double y, double z); int main(void){ double a,b,c;      printf("1つ目の数字を入力>"); scanf("%lg", &a); printf("2つ目の数字を入力>"); scanf("%lg", &b); c=tasu(a,b); printf("%lg\n",c); return 0; } void tasu(int x, int y, int z) { d = e + f; }

  • main()とint main(void)の違い

    最初main()と習ったのですが、最近学校でmain()ではなくint main(void)を使うように なりました。 どのように違うのでしょうか? main関数のところに引数が入っている意味がわかりません。 (void)ってなんですか? そもそも引数って何ですか? あと、プログラムの最後にreturn(0)って書いてあるんですが、これはどういう意味ですか? 回答よろしくお願いします。

  • 結果を報告しない?(void)

    #include<iostream> #include<string> using namespace std; void Aisatu(string n){ cout<<n<<"さん、こんばんわ"<<endl; } int main() { Aisatu("鈴木"); } 上のプログラムで、C++の学習書に「void」とは「この関数は結果をどこにも報告しない、ということ」と書いてありますが、私の理解では下のAisatu("鈴木");という外部の文字列を受け取りcout<<nに「報告」しているように感じられます。どうか解釈がうまくいきますようにご教授いただけないでしょうか。よろしくお願いします。