ページ 11

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

Posted: 2009年1月24日(土) 14:01
by saga
初めまして、龍神録プログラミングの館で疑問に思ったところを質問させてください。

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:龍神録(初期化)について

Posted: 2009年1月24日(土) 16:19
by こめかみ
違ってたらごめんなさい。


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


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


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

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

Posted: 2009年1月24日(土) 16:53
by Dixq (管理人)
memsetで構造体の中身を全て0にしておけば、
=0;
と書かないといけない処理がスキップ出来るのです。
例えば
{
int x,y;
int flag;
}
の3つを持つ構造体があったとし、これを全部

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

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

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

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

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

Posted: 2009年1月24日(土) 19:02
by たかぎ
memsetによる初期化の問題点は、下記で説明しています。
http://www.kijineko.co.jp/tech/supersti ... emset.html
まあ、今回の場合は、処理系を特定しているので実害はでませんが...。

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

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

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

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

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

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

Posted: 2009年1月24日(土) 19:41
by たかぎ
話がそれたついでに...

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

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

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

Posted: 2009年1月24日(土) 23:07
by saga
こめかみさん、管理人さん、たかぎさん、kazuoniさん
ありがとうございます。
memsetを最近知った素人ですので助かります。