DxLibのリリース

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

DxLibのリリース

#1

投稿記事 by mmNa » 5年前

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を持っていることになります。

Rittai_3D
記事: 525
登録日時: 7年前

Re: DxLibのリリース

#2

投稿記事 by Rittai_3D » 5年前

Enemy* aEnemy; を Enemy* aEnemy[20]; にしてみてはどうでしょうか?
あとは、Enemy::Initialize()のIDが範囲外アクセスを起こしていないかチェックして見てください。
初心者です

mmNa

Re: DxLibのリリース

#3

投稿記事 by mmNa » 5年前

Dungeon::Enemy * aEnemy;

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

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

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

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

アバター
みけCAT
記事: 6274
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: DxLibのリリース

#4

投稿記事 by みけCAT » 5年前

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;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

mmNa

Re: DxLibのリリース

#5

投稿記事 by mmNa » 5年前

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

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

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

mmNa

Re: DxLibのリリース

#6

投稿記事 by mmNa » 5年前

おかしな値が入ってしまう箇所に入れないようにすることで、強制終了がなくなりました。
いろいろと異なる値が入ったりしてますので、まだデバッグは続けていこうと思いますが、
一番ネックの部分が超えられたため、一応解決したとします。

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: DxLibのリリース

#7

投稿記事 by softya(ソフト屋) » 5年前

どこか別の関数で、ポインタや配列の添字ミスをしているとよく起こる問題です。
スタックで悪さをしている部分がある気がしますので、ローカル変数の配列などを疑ったほうが良いでしょう。
ねじ伏せると、後々思わぬ時に復活するかも知れません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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