龍神録(初期化)について

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

龍神録(初期化)について

#1

投稿記事 by saga » 16年前

初めまして、龍神録プログラミングの館で疑問に思ったところを質問させてください。

URL : http://dixq.net/rp/19.html

この19章でeffectの登録・計算を行っていますが
void calc_del_effect(){
  int k;
  for(int i=0;i<DEL_EFFECT_MAX;i++){
    if(del_effect.flag>0){
      if(del_effect.cnt%2==0){// 1/30秒ずつセット
        if((k=search_effect())!=-1){//空き番号検索
          memset(&effect[k],0,sizeof(effect_t));//初期化
          effect[k].flag=1;//フラグを立てる
          effect[k].brt=255;//輝度を最大値に
                 ・
                 ・

この初期化を行う意味を教えてもらえないでしょうか。

22章-ボムを撃ってみよう
では同じようなところの初期化では書かれていないみたいで、使い分けなど有ったら知りたいので。

こめかみ

Re:龍神録(初期化)について

#2

投稿記事 by こめかみ » 16年前

違ってたらごめんなさい。


エフェクトを消滅させる関数なので、
次のエフェクト処理に使いまわすのに備えて、
エフェクト構造体を初期化しています…多分。


エフェクトの処理のためにいろいろ使われたデータを
エフェクトを消す処理のついでに初期化しています。


すみません…自信ないです。
次にシューティングに取り掛かるときは
また一章からやり直しかなあ

Dixq (管理人)

Re:龍神録(初期化)について

#3

投稿記事 by Dixq (管理人) » 16年前

memsetで構造体の中身を全て0にしておけば、
=0;
と書かないといけない処理がスキップ出来るのです。
例えば
{
int x,y;
int flag;
}
の3つを持つ構造体があったとし、これを全部

.x=0;
.y=0;
.flag=0;

としなくても、memsetで領域全部を0にしてやれば1行で済むわけです。
また、初期化漏れによるバグ発生の可能性も減らせます。

ここで、意味がある処理であったかどうかわかりませんが、
もし意味が無ければ今後変数が増えた時の為に付けていた処理だったかもしれません。

また、構造体に値を代入する時は、値代入用の関数を作ってもいいと思います。

たかぎ

Re:龍神録(初期化)について

#4

投稿記事 by たかぎ » 16年前

memsetによる初期化の問題点は、下記で説明しています。
http://www.kijineko.co.jp/tech/supersti ... emset.html
まあ、今回の場合は、処理系を特定しているので実害はでませんが...。

> =0;
> と書かないといけない処理がスキップ出来るのです。

これが目的であれば、
effect[k] = effect_t();
で十分ですね。

kazuoni

Re:龍神録(初期化)について

#5

投稿記事 by kazuoni » 16年前

たかぎさんの会社のホームページにある
[迷信]シリーズ大体読破していますw
C++のコラムはまだ読むだけになっているので
時間を見つけて実践していきたいと思ってます^^
(ライブラリ開発入門・・・更新が待ち遠しいですw)

話それました。。失礼しました。(最近コメントそれすぎかなぁ・・・。)

たかぎ

Re:龍神録(初期化)について

#6

投稿記事 by たかぎ » 16年前

話がそれたついでに...

> (ライブラリ開発入門・・・更新が待ち遠しいですw)

大体要望が多いものから順に更新していますので、今月中には何らかの更新ができると思います。
# 最近忙しくて...

saga

Re:龍神録(初期化)について

#7

投稿記事 by saga » 16年前

こめかみさん、管理人さん、たかぎさん、kazuoniさん
ありがとうございます。
memsetを最近知った素人ですので助かります。

閉鎖

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