フラグ変数の宣言の仕方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
T.K

フラグ変数の宣言の仕方

#1

投稿記事 by T.K » 8年前

こんばんは ゲームプログラミング入門者です
C言語の入門サイトとこのサイトの「ゲームプログラミングの館」を全て理解し終わった程度の知識量です
これから書く文の中にはゲームプログラミングの館で使われていたワードを用いるのでもしかしたら一般的ではないのかもしれませんが許してください
また使用ライブラリはDXライブラリを前提としてお話させていただきます

早速、質問なのですがゲームのメインループの中で画像のロードをするためにフラグ変数でロードが終わったかどうかを管理したいのですが
そのフラグ変数の宣言のやり方がよくわかりません
画像のロードのフラグ変数は関数を抜けても記憶しておかねばならないため、その記憶方法について悩んでいます
私の思いついた方法は
・グローバル変数を使う
・静的変数を使う
・new演算子を用いてヒープ領域を使う
・グラフィックデータの識別番号変数に値が入っているか調べる(グラフィックデータの識別番号変数をフラグにする)
以上の4つなのですが、どの方法も短所を考えることができます

フラグ変数はどういった方法で宣言すればいいのでしょうか
また、フラグ変数の管理の仕方なども教えていただきたいです
御回答お願いします

box
記事: 2002
登録日時: 13年前

Re: フラグ変数の宣言の仕方

#2

投稿記事 by box » 8年前

T.K さんが書きました: フラグ変数はどういった方法で宣言すればいいのでしょうか
書かれた4つの方法のいずれについても長所や短所があってご自分では決められない、ということでしょうか。
仮にそうだとしても、フラグを使わなければならないのであれば、どれかを使わざるを得ないわけですよね。
どれでもいいのではないでしょうか。ご自身がわかりやすければ。
T.K さんが書きました: また、フラグ変数の管理の仕方なども教えていただきたいです
ご自身がわかるように管理すればよいと思います。

こういう紋切り型の回答しかできないのは、「何がしたいかをいちばんよくわかっているのは質問者さんご自身であるはずだから」です。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: フラグ変数の宣言の仕方

#3

投稿記事 by みけCAT » 8年前

T.K さんが書きました:私の思いついた方法は
・グローバル変数を使う
・静的変数を使う
・new演算子を用いてヒープ領域を使う
・グラフィックデータの識別番号変数に値が入っているか調べる(グラフィックデータの識別番号変数をフラグにする)
以上の4つなのですが、どの方法も短所を考えることができます
どれがいいかは場合によるかもしれないですが、
・クラスのメンバ変数を使う(抜けても記憶しておかねばならない関数をクラスのメンバにする)
・フラグを格納する変数への参照orポインタを抜けても記憶しておかねばならない関数に渡す
という選択肢もあります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

T.K

Re: フラグ変数の宣言の仕方

#4

投稿記事 by T.K » 8年前

>>boxさん
とりあえず、私の考えた方法で問題がないようでよかったです
先日、練習用のゲームのプログラムを書いてみたところ、エディタにboolとFALSEという単語がずらっと並んでしまったので
これでいいのかと怖くなってしまったので掲示板を利用させていただいたのです・・・


>>みけCATさん
みけCAT さんが書きました: ・クラスのメンバ変数を使う(抜けても記憶しておかねばならない関数をクラスのメンバにする)
・フラグを格納する変数への参照orポインタを抜けても記憶しておかねばならない関数に渡す
抜けても記憶しておかねばならない関数というのはどういう意味でしょうか?
また、二行目の説明も全体的に意味が分かりません(ごめんなさい)
もしよろしければ教えていただけないでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: フラグ変数の宣言の仕方

#5

投稿記事 by みけCAT » 8年前

T.K さんが書きました:抜けても記憶しておかねばならない関数というのはどういう意味でしょうか?
「画像のロードのフラグ変数は関数を抜けても記憶しておかねばならないため、その記憶方法について悩んでいます」という文で言及されている関数、という意味です。
T.K さんが書きました:また、二行目の説明も全体的に意味が分かりません(ごめんなさい)
もしよろしければ教えていただけないでしょうか?
例えば

コード:

#include <cstdio>

struct flags_t {
	int a, b, c;
	flags_t():a(0),b(0),c(0){}
};

void kannsuu(flags_t &flags) {
	int next_a = !flags.a;
	int next_b = flags.a ? !flags.b : flags.b;
	int next_c = (flags.a && flags.b) ? !flags.c : flags.c;
	flags.a = next_a;
	flags.b = next_b;
	flags.c = next_c;
}

int main(void) {
	flags_t flags;
	for (int i = 0; i < 8; i++) {
		kannsuu(flags);
		printf("%d %d %d\n", flags.a, flags.b, flags.c);
	}
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

T.K

Re: フラグ変数の宣言の仕方

#6

投稿記事 by T.K » 8年前

>>みけCATさん
私めの為にわざわざコードまで書いていただいてありがとうございます

ゲームが終わるまで抜けることのないmain関数で、フラグ変数を宣言するということでしょうか?
(↑の認識で合っていますか?)
合っているのだとしたら、ゲームではあらゆるモジュールにフラグ変数が必要になるので
ちょっと管理しづらくなるような・・・?とプログラミング入門者的には思ってしまいます

(構造体のメンバの中に
flags_t():a(0),b(0),c(0){}
このような見慣れない構文があったのですが
これは単に初期値を代入しているだけという考えでいいですか?)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: フラグ変数の宣言の仕方

#7

投稿記事 by みけCAT » 8年前

T.K さんが書きました:ゲームが終わるまで抜けることのないmain関数で、フラグ変数を宣言するということでしょうか?
そんな感じです。
T.K さんが書きました:合っているのだとしたら、ゲームではあらゆるモジュールにフラグ変数が必要になるので
ちょっと管理しづらくなるような・・・?とプログラミング入門者的には思ってしまいます
あくまで選択肢の一つです。
あまり良くない選択肢だったようですね。
T.K さんが書きました:(構造体のメンバの中に
flags_t():a(0),b(0),c(0){}
このような見慣れない構文があったのですが
これは単に初期値を代入しているだけという考えでいいですか?)
ここではそれでいいです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

T.K

Re: フラグ変数の宣言の仕方

#8

投稿記事 by T.K » 8年前

ご返信ありがとうございます!
色々な解決策があるようですが初心者の私には難しそうだったので
おとなしくstaticなグローバル変数を使うことにしました
入門サイトはグローバル変数を使うことに対しての脅しを仕掛けてくるサイトが多く、
なんとなく使用をためらっていたのですが、よくよく考えたら別にstaticであるならば使ってもいいじゃんと思えてきたので
このような解決策とさせていただきました

ここに書き込んだおかげで、どの方法がやりやすいか今一度考えることができました!ありがとうございました!

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: フラグ変数の宣言の仕方

#9

投稿記事 by softya(ソフト屋) » 8年前

誰も補足していないので、書いときますと。
newもflags_t():a(0),b(0),c(0){}もC++で許される書き方です。
DXライブラリはC++でコンパイルされるので問題なく通りますが、文法としてはC言語ではないと言うことはご理解ください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

T.K

Re: フラグ変数の宣言の仕方

#10

投稿記事 by T.K » 8年前

わざわざ御忠告ありがとうございます!

エムアロックはどうしても馴染めないため、クラスもオブジェクト指向も使っていませんが
C++のコンパイラということでnewを使っています
(プログラミング初心者的にはC言語でもnewを早く使わせろと思っちゃうんですが)

今後、混乱しないようにしっかり覚えておきます!

閉鎖

“C言語何でも質問掲示板” へ戻る