ページ 11

サイズ1の変数を作る

Posted: 2014年4月05日(土) 16:46
by 徒歩
サイズが1の変数の宣言として bool を使っていたのですが
インターネットでbool は処理系によってはサイズが違うと書かれていたので
自分で0と1だけの変数を宣言することは可能なのでしょうか?

Re: サイズ1の変数を作る

Posted: 2014年4月05日(土) 17:01
by h2so5
1bitの変数を宣言することはできません。
boolのサイズが処理系依存であることに何か不都合があるのでしょうか。

Re: サイズ1の変数を作る

Posted: 2014年4月05日(土) 17:33
by みけCAT
徒歩 さんが書きました:自分で0と1だけの変数を宣言することは可能なのでしょうか?
言語が指定されていませんが、C言語/C++ならenumを使うのはどうでしょうか?

コード:

enum ZeroOrOne {
	ZERO,ONE
};
ただし、これは「サイズ1の変数」という(私は理解していない)条件を満たさないかもしれません。

Re: サイズ1の変数を作る

Posted: 2014年4月05日(土) 18:08
by 徒歩
>boolのサイズが処理系依存であることに何か不都合があるのでしょうか。

場所によって製作環境が違うので対応させるとなると
何らかの方法でサイズを決める必要があると思いました。


>言語が指定されていませんが、C言語/C++ならenumを使うのはどうでしょうか?

C言語です。 ゲームのフラグデータ保存用で使うのために配列が大きくなってしまいどうにか小さくしようと
思って質問しました

Re: サイズ1の変数を作る

Posted: 2014年4月05日(土) 18:13
by みけCAT
「サイズ1の変数」とはどういうことですか?
1バイトですか?1ワードですか?1セクタですか?1キロバイトですか?それとも…?

Re: サイズ1の変数を作る

Posted: 2014年4月05日(土) 18:26
by 徒歩
フラグデータ用なので出来るだけ1ビットに近いもので出来るようにしたいです

Re: サイズ1の変数を作る

Posted: 2014年4月05日(土) 18:28
by みけCAT
unsigned char型ならパソコン向けのほとんどの環境では1バイト、8ビットだと思う[要出典]ので、
unsigned char型の変数にビット演算を利用してフラグを詰める、というのはどうでしょうか?

Re: サイズ1の変数を作る

Posted: 2014年4月05日(土) 18:30
by h2so5
具体的にどれくらいのデータサイズになるのでしょうか。
本当にビットを詰めなければならないほど余裕が無いのですか?

Re: サイズ1の変数を作る

Posted: 2014年4月05日(土) 18:35
by みけCAT
もしかして、PICなどのマイコンの開発でしょうか?

Re: サイズ1の変数を作る

Posted: 2014年4月05日(土) 18:46
by 徒歩
>unsigned char型の変数にビット演算を利用してフラグを詰める、というのはどうでしょうか?

ビット演算を利用してフラグを詰めることに
まったく気づきませんでした。ありがとうございます。

>本当にビットを詰めなければならないほど余裕が無いのですか?

余裕が無いというほどではありませんが
フラグだけで1000個ほどになるので サイズが小さくて読書きし易い形に出来ることが目標でした。

>もしかして、PICなどのマイコンの開発でしょうか?

RPGゲームを作っています。

Re: サイズ1の変数を作る

Posted: 2014年4月05日(土) 18:48
by h2so5
ビットを詰めると逆に読み書きが難しくなります。
ファイルのサイズを小さくしたいのであればビットを詰めるのではなくgzipなどを利用したほうが良いと思います。

Re: サイズ1の変数を作る

Posted: 2014年4月05日(土) 19:00
by ISLe
ビットフィールドというものもあります。
環境依存が強いので外部記憶には向きませんが。

まあ、char配列の先頭から何ビット目を読み書きするという関数でも用意すれば済む話ですね。
マクロ等でどこを読み書きしてるか分かるようにすれば可読性もさほど悪くないですし。

Re: サイズ1の変数を作る

Posted: 2014年4月05日(土) 19:13
by みけCAT
徒歩 さんが書きました:>本当にビットを詰めなければならないほど余裕が無いのですか?

余裕が無いというほどではありませんが
フラグだけで1000個ほどになるので サイズが小さくて読書きし易い形に出来ることが目標でした。

>もしかして、PICなどのマイコンの開発でしょうか?

RPGゲームを作っています。
マイコン開発を否定しませんでしたね。
自前でSDカードに書き込むときの実装をしやすくするため、データのサイズを1セクタに収めたい、ということでしょうか?

Re: サイズ1の変数を作る

Posted: 2014年4月05日(土) 20:14
by softya(ソフト屋)
パソコン前提なら1byte単位でON/OFF記録しても1000個x1byteでたかが1KB弱です。すごく小さなセーブデータだと思います。
たとえば、初代PSのメモリカードの1ブロックが8KBですから余裕で入るサイズですね。
このぐらいであれば、PSの開発者でもビットは使わないと思いますよ。

Re: サイズ1の変数を作る

Posted: 2014年4月05日(土) 23:45
by ISLe
フラグだけで1000個ほどになる、というのはフラグ以外にデータはないということになるのでしょうか。

Re: サイズ1の変数を作る

Posted: 2014年4月05日(土) 23:53
by softya(ソフト屋)
ISLe さんが書きました:フラグだけで1000個ほどになる、というのはフラグ以外にデータはないということになるのでしょうか。
フラグ以外の容量がデカイのならそちらを問題にすべきかと思いますが、その場合でも1KB程度のフラグセーブデータは許容できるのではと思いました。
徒歩さんに言いたいのは、手間かけて容量を減らすよりも扱いやすくてデバッグしやすい方向でまとめた方が後々良いことばかりです。と言うことです。

Re: サイズ1の変数を作る

Posted: 2014年4月06日(日) 00:19
by ISLe
アクセス用の関数1つ挟むだけで済む話で、手間も掛からないのではないでしょうか。

配列に直接アクセスするよりも関数経由のほうが実装を隠蔽化できて拡張の幅が広がると思います。

わたしはロード・セーブでベタに読み書きするのは良くないと思うので、外部と内部の形式は切り離すべきと考えます。
1バイトずつでも1ビットずつでも自由に切り替えられるように作られているほうがデバッグもしやすいと思います。

Re: サイズ1の変数を作る

Posted: 2014年4月06日(日) 00:31
by softya(ソフト屋)
アクセスレベルの切り離す話と、セーブデータを1bitに押し込める話は別だと私は考えます。
もちろん、アクセスレベルはぜひ切り離すべきだと思っています。

ただ、1bitのデータの検証はバグった時にやはり面倒だと思う次第です。
少なくとも、実装レベルで1バイトづつセーブするよりコードが増えます。
わざわざ書かなくて良いコードを書いてるように思えてなりません。
必要ならすべきです。必要ないなら徹底して私は避けたいです。

Re: サイズ1の変数を作る

Posted: 2014年4月06日(日) 17:37
by ISLe
わたしは外部とやり取りするデータのサイズはユーザー体験に直結すると思っているので質問者さんの意向を尊重したいです。
これ以上はポリシーの問題なので議論は避けたいと思います。