第10章の「敵を出現させてみよう」についてなんですが、ゲームの初期化で少し困っています
memset(&ch,0,sizeof(ch_t));
とありますが、
memset()は、指定されたメモリ領域に、指定した値を格納
sizeof()は、sizeofに渡された型や変数のメモリサイズを調べる
だから「$chに0をsizeof(ch_t)のメモリサイズ分だけ格納する」みたいな解釈で
よろしいのでしょうか?
分かりやすい解釈の仕方があれば教えてください。
よろしくお願いします
無題
Re:無題
memsetは第一引数のポインタの位置から、
第二引数の数値で、
第三引数の大きさ分を問答無用で埋めます
Cではあまり問題がありませんでしたが、
なので、C++ではあまり推奨されていない関数です。
なぜなら、
仮想関数を使っているクラスや
内部で動的にメモリを確保するクラスなどで、
memsetを使うと思わぬバグの温床となりうるからです。
また、sizeofに動的に確保したメモリのポインタなどを渡してしまうと、
問答無用で4が返ってきてしまったりという落とし穴もあります。
上記のことを理解しつつ、
データだけの構造体を0で埋めよう、などの限られた用途であれば利用してみるといいでしょう
第二引数の数値で、
第三引数の大きさ分を問答無用で埋めます
Cではあまり問題がありませんでしたが、
なので、C++ではあまり推奨されていない関数です。
なぜなら、
仮想関数を使っているクラスや
内部で動的にメモリを確保するクラスなどで、
memsetを使うと思わぬバグの温床となりうるからです。
また、sizeofに動的に確保したメモリのポインタなどを渡してしまうと、
問答無用で4が返ってきてしまったりという落とし穴もあります。
上記のことを理解しつつ、
データだけの構造体を0で埋めよう、などの限られた用途であれば利用してみるといいでしょう
Re:無題
>うしおさん
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になると考えてよろしいでしょうか?
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になると考えてよろしいでしょうか?