- 締切済み
外部変数と関数内処理、スマートなのはどっち?
今書いているプログラムで、少し気になったので、皆さんのご意見をお聞きしたいです。 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文はそれなりに煩雑な処理をしていると仮定します) どちらも一長一短ありますが、一般的にはどちらが好まれるのでしょうか?
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- racene
- ベストアンサー率70% (21/30)
static変数を使うのが良いのではないかと思います。 void Sample() { static bool flag = true; if (flag) { A; flag = false; } } 1とやっている事自体は同じですが、flagはSampleの外部には公開されません。
- tatsu99
- ベストアンサー率52% (391/751)
そもそも、 void Sample(){ A式; } は、定期的に呼び出されるものなのですか? 基本的に、一度しか使用しないなら、そこで(たぶん初期処理かとおもいますが) Sampleを呼びだせば、よいのではないでしょうか? また、コマンドにより、プログラムが最初の状態に戻ることがあります。 とのことですが、「プログラムが最初の状態に戻ること」を検知した箇所で、 Sampleを呼びだせば、よいのではないでしょうか? そうすれば、フラグとか条件式等は不要になります。 その場合は、当然ですが、void Sample()は、どこからでも呼び出せるように、 extern void Sample(); の定義をしておく必要があります。
- chie65536(@chie65535)
- ベストアンサー率44% (8802/19961)
>どちらも一長一短ありますが、一般的にはどちらが好まれるのでしょうか? どちらも好ましくない。 >ただ、コマンドにより、プログラムが最初の状態に戻ることがあります。 >その際にはまた、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); } }