• ベストアンサー

関数内の変数の扱い方に関する質問です

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; }

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

  • ベストアンサー
  • petertalk
  • ベストアンサー率69% (156/225)
回答No.2

関数内で、渡された引数に値をセットしても、呼び出し側の変数の値は変わりません。 こういうときは、普通は戻り値を利用しますが、 (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; }

mintia12
質問者

お礼

ご丁寧にありがとうございます。 (1)の方法でやらせていただきます。

その他の回答 (2)

  • goosyu
  • ベストアンサー率58% (36/62)
回答No.3

まず,A()関数はplanの値を返す関数と考えます。 関数コールもとplan変数をコール先で書き換える為にはplan変数のアドレスを渡すことで実現できます。 実際には次のように関数をかえます。 int A(int t,int *pPlan) { if(t % 20 < 10) *pPlan = 1; else *pPlan = 2; } コールもとは次のようにかえます。 A(t, &plan);

mintia12
質問者

お礼

このような書き方があるのですね。 ありがとうございます!

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.1

>良い方法はありませんでしょうか? int A(int t) {  if ( t % 20 < 10 ) {   return 1;  } else {   return 2;  } } として main() 側では plan = A(t); とする。

mintia12
質問者

お礼

ご回答ありがとうございます。 無事にできました。

関連するQ&A

専門家に質問してみよう