- ベストアンサー
関数内の変数の扱い方に関する質問です
Aという関数を作って、メイン関数内の時刻t(0から100)において10おきにplanという変数を変えるプログラムをつくっています。 しかし、メイン関数内の、if(plan == 2){printf("実行\n");}の部分が無視されてしまいます。(関数A内で使ったplanという変数はメイン関数では使えないのですか??)planが2の時に実行と表示させたいのですが、良い方法はありませんでしょうか?どうかよろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> int A(int ,int); int main() { int t=0,plan; for(t=0;t<100;t++){ A(t,plan); if(plan == 2){printf("実行\n");} } return 0; } int A(int t,int plan) { if(t % 20 < 10) plan = 1; else plan = 2; }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
関数内で、渡された引数に値をセットしても、呼び出し側の変数の値は変わりません。 こういうときは、普通は戻り値を利用しますが、 (2)のように変数のアドレスを渡せば、関数内でも呼び出し側の変数の値を変えることができます。 (1). 戻り値で返す。 plan = A(t); int A(int t) { if(t % 20 < 10) return(1); else return(2); } (2). アドレスを渡す。 A(t,&plan); int A(int t,int *plan) { if(t % 20 < 10) *plan = 1; else *plan = 2; }
その他の回答 (2)
- goosyu
- ベストアンサー率58% (36/62)
まず,A()関数はplanの値を返す関数と考えます。 関数コールもとplan変数をコール先で書き換える為にはplan変数のアドレスを渡すことで実現できます。 実際には次のように関数をかえます。 int A(int t,int *pPlan) { if(t % 20 < 10) *pPlan = 1; else *pPlan = 2; } コールもとは次のようにかえます。 A(t, &plan);
お礼
このような書き方があるのですね。 ありがとうございます!
- koko_u_u
- ベストアンサー率18% (216/1139)
>良い方法はありませんでしょうか? int A(int t) { if ( t % 20 < 10 ) { return 1; } else { return 2; } } として main() 側では plan = A(t); とする。
お礼
ご回答ありがとうございます。 無事にできました。
お礼
ご丁寧にありがとうございます。 (1)の方法でやらせていただきます。