プロが教えるわが家の防犯対策術!

今書いているプログラムで、少し気になったので、皆さんのご意見をお聞きしたいです。


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文はそれなりに煩雑な処理をしていると仮定します)

どちらも一長一短ありますが、一般的にはどちらが好まれるのでしょうか?

A 回答 (3件)

static変数を使うのが良いのではないかと思います。



void Sample() {
 static bool flag = true;
 if (flag) {
  A;
  flag = false;
 }
}

1とやっている事自体は同じですが、flagはSampleの外部には公開されません。
    • good
    • 0

そもそも、


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

>どちらも一長一短ありますが、一般的にはどちらが好まれるのでしょうか?



どちらも好ましくない。

>ただ、コマンドにより、プログラムが最初の状態に戻ることがあります。
>その際にはまた、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);
 }
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!