書き込み中アクセス違反?

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

書き込み中アクセス違反?

#1

投稿記事 by » 17年前

龍神録プログラミングの館25章の部分を追加して、デバックを行うとエラーはでないのですが

実行時に0x0054c954 で初回の例外が発生しました: 0xC0000005: 場所 0x00f44000 に書き込み中にアクセス違反が発生しました。 

となって、実行できない状態に陥ってしまいました。

25章のプログラムソースを丸々コピーでなく、全部手打ちでやっているので打ち間違えの可能性も捨てきれないのですが、

追加部分を何回か見比べても打ち間違えはみつからなかったので、どういうときにこのようなことが起こるかわかる人がいましたら、

教えていただけると大変ありがたいです。

プログラムリストのほうも添付したほうがいいのかと思うのですが、なにぶんオリジナルの部分も混じっていたり、どの部分でエラーが出てるかはっきりわからないので、

とりあえず今は何も添付しないでおきますが、そこのプログラムどうなってるんやーなど、ありましたら、随時添付いたします。

プログラムのほうは、ここの龍神録プログラムの館に沿って、作成しています。

何かお気づきのことがありましたら、お願いします。

管理人

Re:書き込み中アクセス違反?

#2

投稿記事 by 管理人 » 17年前

アドレスの指している箇所がおかしいのではないでしょうか。

ブレイクポイントの使い方はご存知でしょうか?

まず、メインループで主な関数をいくつか呼んでいると思いますが、
ブレイクポイントをその関数ごとに付け、
どこでエラーが起きているか突き止めてみてはどうでしょう。
最初はおおまかにポツポツとブレイクポイントをうっておき、
引っかかったらその辺を重点的に細かく調べていけば良いと思います。

どうしても解決しない時はこちらに音楽ファイル以外の全てのデータをプロジェクトごと圧縮して
私の方に送ってもらえたら調べますよ。

Re:書き込み中アクセス違反?

#3

投稿記事 by » 17年前

毎回毎回すばやいお返事ありがとうございます。

とりあえず、ブレイクポイントで突き止めて見たいと思います。

また不明な点があれば質問されていただきます。

これも勉強の一部なので、管理人さんに送るのは本当の最終手段で、使わない気持ちでがんばります。

array

Re:書き込み中アクセス違反?

#4

投稿記事 by array » 17年前

実行時にエラーが出てるので、最初の方にエラーがあるんだとおもいます
load.cpp
ini.cpp
他ヘッダファイル
に変な処理をしてないか確認してみてはどうでしょうか。

最終手段として、25章を追加する前のソースはバックアップを取っているのでしょうか?もし取っているのなら、一度戻して再度導入を試みてはどうでしょうか。

管理人

Re:書き込み中アクセス違反?

#5

投稿記事 by 管理人 » 17年前

ポインタとか使わず、単純なプログラムしか書いてない場合は

「書き込み中にアクセス違反が発生しました。」

と出るときは大抵初期化していない変数を使用しているか、
ループが行き過ぎてオーバーフローになっているかだと思いますから
もし心当たりがあればそちらを確認してみては。

もし初期化してない変数を使用している時は警告が出ると思いますから、
警告が出ているときはそこからダブルクリックで辿ってみて下さい。

まぁブレイクポイントで探していけば見つかると思いますよ。

後関数ポインタ使ってますからエクセルに弾幕番号をかくとこで用意していない番号をかくと
そのようなエラーになると思います。この場合は確かにプログラムコードを読んだだけじゃわからないですね。

たとえ関数ポインタの配列要素を10用意していたとしても、
例えば2つしか格納していないと3つ目から後はアドレス0をさしているわけですから、
用意している数ではなく、関数のアドレスを実際に格納した配列要素数を確認して下さい。

管理人

Re:書き込み中アクセス違反?

#6

投稿記事 by 管理人 » 17年前

上の補足で、関数ポインタを使っているのは

enemy.cppの一番上

void (*enemy_pattern[ENEMY_PATTERN_MAX])(int) = {
    enemy_pattern0,    enemy_pattern1,    enemy_pattern2,    enemy_pattern3,    enemy_pattern4,
    enemy_pattern5,    enemy_pattern6,    enemy_pattern7,    enemy_pattern8,    enemy_pattern9,
    enemy_pattern10,
};
(これだと番号は10まで指せます)

そして

shot.cppの一番上

void (*shot_bullet[SHOT_KND_MAX])(int) ={
	shot_bullet_H000,shot_bullet_H001,shot_bullet_H002,shot_bullet_H003,shot_bullet_H004,
	shot_bullet_H005,shot_bullet_H006,shot_bullet_H007,shot_bullet_H008,shot_bullet_H009,
	shot_bullet_H010,shot_bullet_H011,shot_bullet_H012,shot_bullet_H013,shot_bullet_H014,
	shot_bullet_H015,shot_bullet_H016,shot_bullet_H017,
};
(上の例では17まで指せます)

そして、一番有力なのが、25章付近で追加した、ボスの弾幕に関する関数ポインタです。

func.h

void (*boss_shot_bullet[DANMAKU_MAX])() =
{
	boss_shot_bulletH000,
	boss_shot_bulletH000,
	boss_shot_bulletH000,
	boss_shot_bulletH000,
	boss_shot_bulletH000,
	boss_shot_bulletH000,
	boss_shot_bulletH000,
};

(これなら6まで指せます)

多分ここじゃないかな~・・と思うんですが、まぁ違うかもしれません^^;
エクセルデータもよく確認してみて下さい。
 

Re:書き込み中アクセス違反?

#7

投稿記事 by » 17年前

ここまで書いてもらっていて、エラーの原因がまさかの、 < が抜けていただけなんて!ちょっと恥ずかしすぎる・・・orz

ブレイクポイント使っていったら簡単に見つかりました。こんな便利な機能があっただなんて・・本当にありがとうございます!!

あと、しょーもないミスでここまで書いてもらって本当にすみませんでした!

大変ご迷惑をおかけしました・・・orz

管理人

Re:書き込み中アクセス違反?

#8

投稿記事 by 管理人 » 17年前

>しょーもないミスでここまで書いてもらって本当にすみませんでした!

いえいえ。しかし、
「一番有力なのが」とかわざわざ赤字にしておいて、原因が違ったという空振りさw

"<"抜けということでしたが、もしよければ具体的にどういうミスだったか教えてもらえませんか?
過去ログに残しておけば、もしかしたら今後似たようなミスをした方の参考になるかもしれません。

ブレイクポイントはわざわざprintfDxとかしなくても
そこで変数に何が入ってるか確認も出来るし便利ですよb

Re:書き込み中アクセス違反?

#9

投稿記事 by » 17年前

原因はini.cpp内のvoid ini()で

for(int i=0;i<DANMAKU_MAX;i++)//弾幕それぞれの背景の種類
boss.back_knd=1;

ここの、i<DANMAKU_MAX;の < が抜けていたというすごく簡単なミスでした。

しかし、ビルド時にはまったくエラーを出してくれなく、デバックで実行したとたんに先ほどのエラーが出るという始末でした。
参考?になるかわかりませんが全力でご協力いたします。

あぁ、恥ずかしすぎて誰か幻想郷にとばしてくれ(ぁ

管理人

Re:書き込み中アクセス違反?

#10

投稿記事 by 管理人 » 17年前

なるほど、継続条件が常に真になってループからエラーが起こるまで抜けなかったという事ですね。
ご報告ありがとうございます。

>幻想郷

東方ネタですかw

閉鎖

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