質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

6回答

15572閲覧

if文でのフラグ分岐の効率化について

GOTOken

総合スコア54

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2018/08/15 18:09

if文での複数のフラグ変数の宣言を無くすには

c#

1 bool flg = false; 2 bool flg1 = false; 3 bool flg2 = false; 4 bool flg3 = false; 5 bool flg4 = false; 6 7if(!flg) 8 { 9 flg = true; 10 //アイテム入手後の処理のような 11 } 12if(!flg1) 13 { 14   flg1 = true; 15 //要素数に達した時に1回通る 16 } 17if(!flg2) 18 { 19   flg2 = true; 20 //要素数に達した時に1回通る 21 } 22if(!flg3) 23 { 24   flg3 = true; 25 //要素数に達した時に1回通る 26 } 27if(!flg4) 28 { 29   flg4 = true; 30 //要素数に達した時に1回通る 31 }

このように無駄の多い宣言をしてしまっているような気がするとともに、管理がしにくいと感じています。
switch文での制御もしていたのですが、それでもこのような変数が必要な場面に多々遭遇してしまいます。
Flg変数を使う場合でも、このように大量に宣言しない書き方をご教授していただけると嬉しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

「Flagを効率よく管理する」というのはすでにいくつか案が出ているので、ちょっと別視点で。

ゲームを作る(というかアプリ全般にも言える話ですが)場合、フラグを極力減らす方向で考えたほうがよいです。

そして先人たちは色々な便利な手法を編み出し、それらを「デザインパターン」と呼んでいます。
もしかしたら学ぶにはまだ少し早いかもしれませんが、「フラグ管理大変」という思いが出てきたのであれば、一度調べてみてもいいかもしれません。

今回のフラグがどういった形で使われるかによるので一概にどのパターンがいいか、という話はできないのですが、「状態を管理する」という意味では「ステートパターン」あたりから調べてみるといいと思います。

繰り返しますが、もしかしたら学ぶのには少し早いかもしれません。
なので、むずかしいな、とかどう使うかまったく分からん・・となったら、まずはここで回答されている内容をヒントに(デザインパターンを使わずに)実装してみるのがいいと思います。

個人的に、デザインパターンという単語自体を知らずに苦労していた時期があるので、単語だけでも覚えておいてもらえるといいかなと思って書きました。参考になれば。

投稿2018/08/16 01:07

edo_m18

総合スコア2283

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

コメントに書いてあるような処理をするなら、
状態を保持するオブジェクトを作って、オブジェクトに聞くのでしょうかね。

投稿2018/08/16 00:44

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

個人開発で、明日の自分も上手くやってくれると信じてるぜ!ということなら、
bool[] flags;と配列化。(何番が何のフラグかはコメントに書いたりしておく)
if (flags[3]) { }のように使ったりforで回したり出来ます。
類型でDictionary<string, bool>も一応挙げておきます。
(宣言が減るだけでif文の分岐は減らない可能性が高いですけどね……!)

まぁマジックナンバーやらstringで指定するのはあんまり宜しくないので、**「本当にその変数が必要なのか」「本当にその型でいいのか」**を考慮した方がいいでしょうね。

例示されている「要素数に達した時に1回通る」のようなケースだと上記の配列で上手く動くかもしれませんが、別案としてboolでなくint変数1つにして「達した要素数を入れておく」でもいいかもしれません(これだとif文1つに出来そう)。

投稿2018/08/16 01:36

sakura_hana

総合スコア11427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

public bool FlagAction(bool flag,Action action) { if(!flag) { action(); flag = true; } return flag; }

こういう関数を作って、

flag = FlagAction(flag , ()=>{やりたいこと });

という感じで使うのも一案か。

flag変数が多くて大変なら、クラスor構造体を作ればいいじゃないとしか。

実は、flag変数なんて必要ないのもあるとかいうオチがありそうだけど。

投稿2018/08/15 18:48

編集2018/08/15 18:56
kiichi54321

総合スコア1984

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

フラグ変数を
unsigned int flags=0;
で定義しておいて、

flags |=1; // set
flags &= ~1; // reset
if((flags & 1)!=0) // check flag

としておけば、unsigned intなら32個までのフラグ操作ができます
おまけに、flags の数値チェックで、32個のフラグの状態チェックを一括でできますね

投稿2018/08/15 22:16

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2018/08/15 22:30

そのような使い方なら FlagsAttribute をつけた enum がいいと思います。
y_waiwai

2018/08/15 22:33

おっしゃるとおりです。 まあ、タグにC/C++もあったんで、こーゆーふーに。
yumetodo

2018/08/16 09:46

というかstd::bitsetありますよね、bit節約したいなら
guest

0

Flgを減らすには状態遷移図を書いて、管理する状態を整理してみればいいと思います。
またその後に再利用しなくてすむ場合なら以下のように状態をFlgに保存しない方法もあります。

c

1if ((fp = fopen(filename, "w")) == NULL) { 2 // ファイルデスクリプタがNULLの場合=ファイルのオープンに失敗した場合 3}

投稿2018/08/17 05:00

fu7mu4

総合スコア1088

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問