• 締切済み

外部変数と関数内処理、スマートなのはどっち?

今書いているプログラムで、少し気になったので、皆さんのご意見をお聞きしたいです。 void Sample(){   A式; } 上記のようなひとつの関数があるとします。 Sample()は、プラグラムの中では基本的には一度しか使用しません。 ただ、コマンドにより、プログラムが最初の状態に戻ることがあります。 その際にはまた、Sample()を一度だけ実行する仕様としたいです。 この動作を実現する方法として、私が考え付いたのは以下の2つ、 1. 外部変数(bool型辺り)を使い、最初の状態に戻った時にフラグを立つようにする。 そして、フラグが立っているときのみSample()を実行、終了時にそのフラグを消す。  (例)  bool flag;    void Sample(){      if( flag ){      A式;    }  } 2. Sample()内で最初の状態に戻ったことを検知するB文を置き、   最初の状態と判断した(B文が真)ときだけA式を実行する。  (例)    void Sample(){   if( !B文 ) return;     A式;  } 前者は、記述的には簡単ですが、外部変数が増えてしまいます。 後者は、関数内で閉じて判断できますが、毎回B文のチェックが必要。 (B文はそれなりに煩雑な処理をしていると仮定します) どちらも一長一短ありますが、一般的にはどちらが好まれるのでしょうか?

みんなの回答

  • racene
  • ベストアンサー率70% (21/30)
回答No.3

static変数を使うのが良いのではないかと思います。 void Sample() {  static bool flag = true;  if (flag) {   A;   flag = false;  } } 1とやっている事自体は同じですが、flagはSampleの外部には公開されません。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

そもそも、 void Sample(){   A式; } は、定期的に呼び出されるものなのですか? 基本的に、一度しか使用しないなら、そこで(たぶん初期処理かとおもいますが) Sampleを呼びだせば、よいのではないでしょうか? また、コマンドにより、プログラムが最初の状態に戻ることがあります。 とのことですが、「プログラムが最初の状態に戻ること」を検知した箇所で、 Sampleを呼びだせば、よいのではないでしょうか? そうすれば、フラグとか条件式等は不要になります。 その場合は、当然ですが、void Sample()は、どこからでも呼び出せるように、 extern void Sample(); の定義をしておく必要があります。

回答No.1

>どちらも一長一短ありますが、一般的にはどちらが好まれるのでしょうか? どちらも好ましくない。 >ただ、コマンドにより、プログラムが最初の状態に戻ることがあります。 >その際にはまた、Sample()を一度だけ実行する仕様としたいです。 そういう場合は「exec関数で自分自身を起動させてから、自分自身を終了する」とか「setjump、longjumpを使って、main関数の頭に戻る」とかって方法を取る。 main.c -------- pubpic jmp_buf jmp_env; int main(int argc,char *argv[]) {  setjump(jmp_env);  Sample();  //何らかの処理。たぶん、subfunc()を呼ぶような処理  return 0; } sub.c -------- extern jmp_buf jmp_env; void subfunc(void) {  //main関数の中から呼ばれたどこか  //main関数と同一スレッドでなければいけない  //再起動コマンドを受けた  if (再起動条件) {   longjump(jmp_env,1);  } }

関連するQ&A