ページ 11

無題

Posted: 2010年9月09日(木) 12:29
by ガム
第10章の「敵を出現させてみよう」についてなんですが、ゲームの初期化で少し困っています

  memset(&ch,0,sizeof(ch_t));

とありますが、

memset()は、指定されたメモリ領域に、指定した値を格納
sizeof()は、sizeofに渡された型や変数のメモリサイズを調べる

だから「$chに0をsizeof(ch_t)のメモリサイズ分だけ格納する」みたいな解釈で
よろしいのでしょうか?

分かりやすい解釈の仕方があれば教えてください。

よろしくお願いします

Re:無題

Posted: 2010年9月09日(木) 14:47
by うしお
memsetは第一引数のポインタの位置から、
第二引数の数値で、
第三引数の大きさ分を問答無用で埋めます

Cではあまり問題がありませんでしたが、
なので、C++ではあまり推奨されていない関数です。
なぜなら、

仮想関数を使っているクラスや
内部で動的にメモリを確保するクラスなどで、
memsetを使うと思わぬバグの温床となりうるからです。

また、sizeofに動的に確保したメモリのポインタなどを渡してしまうと、
問答無用で4が返ってきてしまったりという落とし穴もあります。
上記のことを理解しつつ、

データだけの構造体を0で埋めよう、などの限られた用途であれば利用してみるといいでしょう

Re:無題

Posted: 2010年9月09日(木) 15:28
by ガム
>うしおさん


typedef struct{
int flag; //フラグ
int cnt; //カウンタ
int power; //パワー
int point; //ポイント
int score; //スコア
int num; //残機数
int mutekicnt; //無敵状態とカウント
int shot_mode; //ショットモード
int img;
int slow; //スローかどうか
double x,y; //座標
}ch_t;
構造体の中身はこのようになっています。

仮にch.x=10 ch.y=10となっている時に

memset(&ch,0,sizeof(ch_t));

をすると初期化されてch.x=0 ch.y=0になると考えてよろしいでしょうか?

Re:無題

Posted: 2010年9月09日(木) 15:51
by うしお
なります。
また、自分で出力されてみて値をチェックするのが安定かと思います。
思わぬ別な要因で値がずれ込む可能性もなくはないと思いますので

Re:無題

Posted: 2010年9月09日(木) 17:01
by フリオ
 
 こちらのスレッドが参考になるのではないでしょうか。
http://www.play21.jp/board/formz.cgi?ac ... &rln=60573
 

Re:無題

Posted: 2010年9月09日(木) 17:57
by ガム
>うしおさん
>フリオさん

初期化について理解することができました。

教えてくださってありがとうございました。