VC++でDebugとReleaseで結果が異なってしまう

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

VC++でDebugとReleaseで結果が異なってしまう

#1

投稿記事 by DG » 15年前

環境はVC++2008EE Vista32bit なのですが、
DebugとReleaseでプログラムを実行したときに結果が異なり、Releaseの時に
特定の場所で動作が停止してしまいます。

2次元配列を使っているところなので、メモリの使い方が変わったことが原因なのではないかと
思うのですが、どうにもわかりません。
2次元配列を含む構造体をファイルに保存するときに、
2次元配列の[1][~]のとこを変えて保存しようとするだけ動作が止まってしまいます。

具体的には、

この構造体を
(CH_NUMはマクロで定義して、4になっています)

typedef struct{
 int pre_chnum;
 int battle_high[CH_NUM][CH_NUM];
}save_data_t;


この関数で

void savedata_write(){
 FILE *fp;
 errno_t err;

 if( ( err = fopen_s( &fp, savefile, "wb" ) ) !=0 ) {
  MessageBox(
  NULL ,
  TEXT("セーブデータの保存に失敗しました。") ,
  TEXT("書き込み失敗") ,
  MB_OK );
 }
 else{
  fwrite( &save_data, sizeof(save_data_t), 1, fp ) ;
  fclose( fp );
 }
}

(save_dataは save_data_t save_data; として大域変数として宣言しています.)

ファイルに記録しているのですが、2次元配列の2行目の値
( save_data.battle_high[1][(0~3のどれでも)] )
を変えて(この時点では停止していない) savedata_write() で保存するときに動作が停止してしまいます。

なんで[1][~]のとこだけダメなんだろ・・・といった感じなのですが、どういうことなのでしょうか? 画像

めるぽん

Re:VC++でDebugとReleaseで結果が異なってしまう

#2

投稿記事 by めるぽん » 15年前

適当に書いてみましたが、Debug, Release で正常にファイルが出力されました。環境は VS2008、Windows XP です。
#include <stdio.h>

const int CH_NUM = 4;

typedef struct{
    int pre_chnum;
    int battle_high[CH_NUM][CH_NUM];
}save_data_t;

save_data_t save_data;

void savedata_write(){
    FILE *fp;
    errno_t err;

    if( ( err = fopen_s( &fp, "hoge.txt", "wb" ) ) !=0 ) {
    }
    else {
        fwrite( &save_data, sizeof(save_data_t), 1, fp ) ;
        fclose( fp );
    }
}

int main(){ 
    save_data.battle_high[1][2] = 10;
    savedata_write();
}
DG さんのソースを見る限り特に問題があるようには見えない(見落としてるだけかもしれません)ので、もしかしたらそのコード以外の場所でおかしくなっているのかもしれません。

DG

Re:VC++でDebugとReleaseで結果が異なってしまう

#3

投稿記事 by DG » 15年前

>>ぬるぽんさん

そうですね・・・自分も同じように問題のありそうな部分を抜き出して、そこだけで
実行してみると問題なくうごきました。

ちなみに、データのロードは以下のようにしているのですが、

void savedata_read(){
FILE *fp;
errno_t err;


if( ( err = fopen_s( &fp, savefile, "rb" ) ) !=0 ) {
memset(&save_data,0,sizeof(save_data_t));
}
else{
fread( &save_data, sizeof(save_data_t), 1, fp ) ;
fclose( fp );
}
}


これも問題なく動いているようでした。

お手上げです(;´ ェ`)

めるぽん

Re:VC++でDebugとReleaseで結果が異なってしまう

#4

投稿記事 by めるぽん » 15年前

問題なければソースコード全体を添付していただけませんか?

DG

Re:VC++でDebugとReleaseで結果が異なってしまう

#5

投稿記事 by DG » 15年前

あまり綺麗なものではないのでちょっと恥ずかしいのですが、よろしくお願いします。
こちらからダウンロードして下さい。
http://dl.dropbox.com/u/3912563/VSB.zip

セーブデータに関わるところは、
grobal.h の一番下の部分
save.cpp
battle.cpp のbattle_end()の最後の部分とdraw_highscore()
です。

savedata_chadd()というのがありますが、これは使用していなくても例の問題は起きました。

それと、2次元配列にしているところを1次元配列にして保存したらいけるかな?っと思って
やってみたのですが、ダメでした。

実行するときにはここ
http://dl.dropbox.com/u/3912563/VAIN%20Shot%201.2.zip
からdata.dxaをプロジェクトのフォルダに入れて実行してください。
簡単な入力の説明も入っています。


それと、2次元配列で1行目の値を扱うときは、プレイヤー1の選択したキャラが
「鏡音リン」で、変数select1pの値が1のときです。
このときにデータをセーブする(COM対戦で、勝利してハイスコアをだす)ときにプログラムが
停止してしまいます。

とっとと相手を倒せるように、3番目のキャラ、「巡音ルカ」のHPはギリギリまで少なくしてあります。

めるぽん

Re:VC++でDebugとReleaseで結果が異なってしまう

#6

投稿記事 by めるぽん » 15年前

リソースのリンクが切れていたのでソースだけで実行しましたが、rin.cpp の 847 行目と 944 行目、
for(i=0;i<200;i++)    hosou_flag=0;

hosou_flag は SPS_MAX 個の配列ですが、SPS_MAX は 100 と定義されているため、ここでアクセス違反が起きておかしな動作を引き起こしているようです。

DG

Re:VC++でDebugとReleaseで結果が異なってしまう

#7

投稿記事 by DG » 15年前

うぉ、ありがとうございます!
いろいろやってたあとにちゃんと整理していなかったみたいです(;´ ェ`)
そんなところでメモリがぐちゃぐちゃになってしまったのが今になって影響してきていたんですね・・・
いい勉強になりました。

他人のコードを見るのは疲れるでしょうけれども、おかげさまで助かりました。
ありがとうございました。 画像

閉鎖

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