ページ 11

構造体内のデータが変化する現象について

Posted: 2010年3月08日(月) 00:18
by no
こんにちは、一日考えてわからなかったので質問します。
以下の構造体があるとします。
typedef struct{
    double x,y;
    int flag,counter,maxhp,hp,pattern;
}BODY_enemy_t;
これらの数値を以下の関数を用いて初期化しました。
void ini(){
  enemy.flag=0;
  enemy.hp=11000;
  enemy.maxhp=11000;    
}
この段階では指示通りに変数が代入されます。しかし、
"hp"の前に何らかの変数を追加すると"hp"の値がini関数を通しているのにも関わらず"0"になってしまいます。
たとえば、以下に●を追加すると、hpの中の数値が"0"になります。ini関数通過後も、です。

例をあげると、以下のパターンです。
typedef struct{
    double x,y;
    int flag,●,counter,maxhp,hp,pattern;
}BODY_enemy_t;
typedef struct{
    double x,y,●;
    int flag,counter,maxhp,hp,pattern;
}BODY_enemy_t;
で、hpのあとに●を追加した場合はhpが0にならず、想定どおりに動作します。


*ここでいう想定どおりとは「hpに11000」が代入されるという意味です。
*●は半角英字とお考え下さい。

このように、構造体に箱を追加した後に、そのデータが変化してしまうのはどういった理由が考えられますか?
よろしくお願いします。

環境はvc++2008、winXPです。

Re:構造体内のデータが変化する現象について

Posted: 2010年3月08日(月) 00:20
by no
>で、hpのあとに●を追加した場合はhpが0にならず、想定どおりに動作します。

とは、

typedef struct{
double x,y;
int flag,counter,maxhp,hp,●,pattern;
}BODY_enemy_t;

このような状態のことです。
こちらの場合はini関数通過後、11000が代入されています。

Re:構造体内のデータが変化する現象について

Posted: 2010年3月08日(月) 01:01
by たかぎ
ソースもなければ詳しい状況もわからないので推測の域を出ませんが...

一番可能性が高いのは、翻訳単位間で構造体の定義が矛盾していることかと思います。

Re:構造体内のデータが変化する現象について

Posted: 2010年3月08日(月) 02:58
by no
定義の矛盾なのかはわかりませんが、現在以下のようにしています。

sp.h-------------------------
//構造体
    //プレイヤーに関する構造体
typedef struct{
    double x,y;
    int status,counter;
    int shot[11][15];
    int hp,mp,maxhp,maxmp;
}BODY_player_t;
extern BODY_player_t Player;

typedef struct{
    double x,y,angle;
    int flag,atari;
}SHOT_T;
extern SHOT_T PlayerShot[PLAYER_MAX_SHOT1][PLAYER_MAX_SHOT2];

    //敵に関する構造体
typedef struct{
    double x,y;
    int flag,counter,maxhp,hp,pattern;
}BODY_enemy_t;
extern BODY_enemy_t enemy; 
    
    //敵の弾に関する構造体A
typedef struct{
    int flag,spead;
    double x,y;
}ENEMY_SHOTS_t;

    //敵の弾に関する構造体B
typedef struct{
    int flag,pattern,counter,img;
    double mem_ex , mem_ey , mem_px , mem_py , Angle[ENEMY_TOTAL_SHOT_NUM]; //200
    ENEMY_SHOTS_t EnemyShots[ENEMY_TOTAL_SHOT_NUM][TOTAL_SHOT_KND]; //200
}ENEMY_SHOT_t;
extern ENEMY_SHOT_t EnemyShot;
-----------------------------

これをすべての.cppにインクルードし、

1.cpp------------------------
BODY_player_t Player; 
    BODY_enemy_t enemy;
    SHOT_T PlayerShot[PLAYER_MAX_SHOT1][PLAYER_MAX_SHOT2];
    ENEMY_SHOTS_t EnemyShots[ENEMY_TOTAL_SHOT_NUM];
    ENEMY_SHOT_t EnemyShot;
-----------------------------

としています。

sp.hで、DxLib.hをインクルードし、
仕様している.cppのすべてにsp.hをインクルードしている状態です。

感想を述べますと、ちょっと構造体の使用方法が異なったため「おや?」と思いましたが、今まで問題なく動作していたのでこのまま作業していました。

ですがもしかしたら、水面下で問題が起きていたのにもかかわらず表面にでていなかった、そしてそれが今回表面上にでた、というものなのでしょうか。

もしこれらの開示情報で読み取れる問題点などあれば指摘下さい。
他に、開示して欲しい情報があれば記していただくと助かります。

Re:構造体内のデータが変化する現象について

Posted: 2010年3月08日(月) 10:44
by softya
ヘッダファイルがソリューションエクスプローラに登録されていないと、ビルド時にヘッダが変更されてもビルドされません。それでじゃないですか?

Re:構造体内のデータが変化する現象について

Posted: 2010年3月08日(月) 13:26
by no
ソリューションエクスプローラに登録している、とは、ソリューションエクスプローラ内に該当のヘッダファイルがある、と同義ですか?

ソリューションエクスプローラの、プロジェクトの中に該当ヘッダファイルは存在します。
もし違うのでしたら、申し訳ありませんがどのようにすればよいか教えてもらえますか?

ただ今までこのヘッダファイルを数ヶ月ずっと使ってきて、突然このような現象が起きて困っています。

Re:構造体内のデータが変化する現象について

Posted: 2010年3月08日(月) 20:50
by Justy
 リビルドしてみては?

Re:構造体内のデータが変化する現象について

Posted: 2010年3月08日(月) 22:26
by Col
vcならばメモリを覗けば一発で原因が分かるでしょう

Re:構造体内のデータが変化する現象について

Posted: 2010年3月09日(火) 00:29
by no
みなさん、ありがとうございました。
リビルドしたところ、解決しました。
ビルドやリビルド、ヘッダの数値などの認識が甘いようなので、少し勉強してみたいと思います。

ただ、今後の発展の為お聞きしますが、メモリを覗く、とは具体的にどのような方法でしょう?
DrawFormatStringなどの関数で値を確認するという意味でしょうか?

Re:構造体内のデータが変化する現象について

Posted: 2010年3月10日(水) 23:06
by Col
enemy変数をクイックウォッチで単純に参照するのもありだし
ini関数を
void ini(){
BODY_enemy_t *p = &enemy; ← これ追加
enemy.flag=0;
enemy.hp=11000;
enemy.maxhp=11000;
}
こうしておいて、
[デバッグ]→[ウィンドウ]→[メモリ]→[メモリ1]
でメモリのウィンドウを開きます
デバッグビルドでini関数をステップ実行してpのアドレスのメモリをみると
構造体の各メンバの領域が順番に初期化されていく様子が分かると思います
間違っていたらごめんなさいね