今書いているプログラムで、少し気になったので、皆さんのご意見をお聞きしたいです。
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件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
static変数を使うのが良いのではないかと思います。
void Sample() {
static bool flag = true;
if (flag) {
A;
flag = false;
}
}
1とやっている事自体は同じですが、flagはSampleの外部には公開されません。
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux bashの変数でブランクがあるかチェックする方法教えて下さい。 3 2023/04/06 16:09
- Windows 10 bash の -z オプションがうまく動作しない原因を教えて下さい。 4 2023/03/22 18:04
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- JavaScript functionはhtmlやjsに2度使えませんか 2 2022/08/03 19:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Macターミナルで実行中のプログ...
-
プログラミング ソースコード
-
なんかC言語でプログラム書いて...
-
VB上で実行中の無限ループの止め方
-
getchar()の意味・・・
-
sendkeysにてALT+CTRL+INSERTを...
-
C言語で途中までしか、プログラ...
-
VBAで外部プログラムを非表示で...
-
fortran a.exe システムエラー
-
MACで動く実行ファイルをWindow...
-
終了してもプログラムが実行し...
-
一瞬で消える
-
VB.NETで作ったプログラムがサ...
-
初期化は、main関数の外で...
-
NORTiプログラムのROM化
-
VB6やVB.NETはコンパイル無しで...
-
Java Autoupdater
-
インスタンスとは何ですか?
-
JavaScriptでレースゲームを作...
-
C言語のFFTについて教えてくだ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Macターミナルで実行中のプログ...
-
なんかC言語でプログラム書いて...
-
プログラミング ソースコード
-
MACで動く実行ファイルをWindow...
-
実行時エラー429
-
Windows10でDOSゲーム
-
VB上で実行中の無限ループの止め方
-
他のPC上にあるexeを、そのP...
-
sendkeysにてALT+CTRL+INSERTを...
-
VBAで外部プログラムを非表示で...
-
システム資源とは?
-
プロセス間通信について
-
アクセス[ファイルを開かずに、...
-
C言語でプログラムを再起動
-
C言語で途中までしか、プログラ...
-
system関数を使用してsuコマン...
-
終了してもプログラムが実行し...
-
PIC のデータEEPROMに書き込み...
-
実行中の実行ファイルの上書き
-
他の実行ファイルを実行するプ...
おすすめ情報