ページ 11

DxLibのリリース

Posted: 2015年3月17日(火) 05:30
by mmNa
VS上でのDebugは問題なく動いたのですが、Releaseを行うと動作を停止してしまい困っています。
自分で調べたところ、どうやら敵の情報が初期化されていないようでした。
処理は関係のある個所はだいたい以下のようになっているのですが、もしわかりましたらコメントお願いいたします。
一応新・C言語 ~ゲームプログラミングの館~の分割コンパイル(2)や(3)あたりを参考にしています。

コード:

//ダンジョンシーンに移ったとき呼ばれる
Dungeon::Dungeon(ISceneChanger* changer) : BaseScene(changer){
aEnemy = new Enemy[20]; //ヘッダで宣言 Enemy *aEnemy
}

void Dungeon::Initialize(){
int x = 0;
int y = 0;
for(int n = 0; n<20; n++){
mEnemy.Initialize( &aEnemy[n], n, x, y);
}
}

void Enemy::Initialize(Enemy *enemy, int ID, x, y){
enemy->eneID = ID; //Enemyのメンバ
enemy->eneX = x;
enemy->eneY = y;
enemy->eneName = mEData.Name[ID]; //Enemyクラスが持つ敵の情報に関するクラスのメンバで、IDに対応。
//このmEDataのメンバには情報が入っていることを確認済み。しかし代入されない
...
}
補足として、mEnemyはEnemyの関数の相対参照用の実体で、他には使用していません。
Initializeがいろんなクラスで被るうえ、他の関数にも影響が出るためstatic関数にはしていません。
staticなのはmEDataぐらいです。
DungeonがEnemyをもち、EnemyがmEDataを持っていることになります。

Re: DxLibのリリース

Posted: 2015年3月17日(火) 09:22
by Rittai_3D
Enemy* aEnemy; を Enemy* aEnemy[20]; にしてみてはどうでしょうか?
あとは、Enemy::Initialize()のIDが範囲外アクセスを起こしていないかチェックして見てください。

Re: DxLibのリリース

Posted: 2015年3月17日(火) 10:28
by mmNa
Dungeon::Enemy * aEnemy;

Dungeon::Enemy *aEnemy[20];
に変えてみましたが、アクセスエラーが発生してしまいました。
ちなみにID部分は調べた限り範囲外アクセスはしていませんでした。

変更前のものはnewをしていたのですが、*aEnemy[20]に変えてからnewを消したのですが、
配列へのポインタはnewがいるのでしょうか。
書き方が見つからなかったため消したまま試しています。

また、releaseでのデバッグをおこなったところ、F10やF11による逐次確認したのですが、
なぜか処理が飛んだり戻ったりしていました。
releaseでのデバッグが初めてなので、これがどういったことかまだ把握できておりません。
アクセスエラーが出たのは、処理が飛んでしまったためにおかしな値が入っていることによるもののようですが。。。

シーンなどが多岐にわたるため、改めて原因を洗おうと思いますが、なにかわかりましたらコメントを
お願いいたします。

Re: DxLibのリリース

Posted: 2015年3月17日(火) 10:40
by みけCAT
mmNa さんが書きました:Dungeon::Enemy * aEnemy;

Dungeon::Enemy *aEnemy[20];
に変えてみましたが、アクセスエラーが発生してしまいました。
Dungeon::Enemy aEnemy[20];としてみてください。
mmNa さんが書きました:配列へのポインタはnewがいるのでしょうか。
いいえ。

コード:

#include <cstdio>

int main(void) {
	int a[3] = {346, 573, 765};
	int (*p)[3]; // 「配列へのポインタ」
	p = &a;
	(*p)[2] = 42;
	printf("%d\n", a[2]);
	return 0;
}

Re: DxLibのリリース

Posted: 2015年3月17日(火) 12:04
by mmNa
Enemy aEnemy[20];にしてみましたが変化はありませんでした。
いろいろいじって、VS上でのリリースで最適化を切り、正常な値が入ることを確認したのですが、
DxLibで出力したexeファイルでのみ強制終了してしまいます。

他に使用している画像なども読み込めているため、そのあたりは大丈夫そうなのですが、
デバッグすると値が全く予期していないもの(たとえばfor文でn回まわすとき、n<20としているのにn=8800)が入っているなどです。
ちなみに、外部で別にnを定義等しておりません。

リリースのアプリケーション版のみこういったことがおこるのはよくあることなのでしょうか。

Re: DxLibのリリース

Posted: 2015年3月17日(火) 12:32
by mmNa
おかしな値が入ってしまう箇所に入れないようにすることで、強制終了がなくなりました。
いろいろと異なる値が入ったりしてますので、まだデバッグは続けていこうと思いますが、
一番ネックの部分が超えられたため、一応解決したとします。

コメントいただいた方々、ありがとうございました。今後配列へのポインタなど、自分が普段使わないものも
調べて活用幅を広げたいと思います。

Re: DxLibのリリース

Posted: 2015年3月17日(火) 13:15
by softya(ソフト屋)
どこか別の関数で、ポインタや配列の添字ミスをしているとよく起こる問題です。
スタックで悪さをしている部分がある気がしますので、ローカル変数の配列などを疑ったほうが良いでしょう。
ねじ伏せると、後々思わぬ時に復活するかも知れません。