無題

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

無題

#1

投稿記事 by ガム » 15年前

第10章の「敵を出現させてみよう」についてなんですが、ゲームの初期化で少し困っています

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

とありますが、

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

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

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

よろしくお願いします

うしお

Re:無題

#2

投稿記事 by うしお » 15年前

memsetは第一引数のポインタの位置から、
第二引数の数値で、
第三引数の大きさ分を問答無用で埋めます

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

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

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

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

ガム

Re:無題

#3

投稿記事 by ガム » 15年前

>うしおさん


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:無題

#4

投稿記事 by うしお » 15年前

なります。
また、自分で出力されてみて値をチェックするのが安定かと思います。
思わぬ別な要因で値がずれ込む可能性もなくはないと思いますので

フリオ

Re:無題

#5

投稿記事 by フリオ » 15年前

 
 こちらのスレッドが参考になるのではないでしょうか。
http://www.play21.jp/board/formz.cgi?ac ... &rln=60573
 

ガム

Re:無題

#6

投稿記事 by ガム » 15年前

>うしおさん
>フリオさん

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

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

閉鎖

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