keito94 さんが書きました:エラー対策などはしっかり調べて、しっかり対処しました。
しっかり対処していないからエラーが出るんですよね?
「しっかり対処したつもりです」の間違いですよね?
keito94 さんが書きました:コード:
DrawRectGraph((int)(x*MAP_CELL), (int)(y*MAP_CELL), src_x, src_y, MAP_CELL, MAP_CELL, MapGraph[index], TRUE, FALSE); //ここで例外が起こっている。
keito94 さんが書きました:コード:
0x0067C8DA で例外がスローされました (スタアド.exe 内): 0xC0000005: 場所 0x00000008 の読み取り中にアクセス違反が発生しました
まず、この行でポインタを扱うのはMapGraph[index]しかありません。
MapGraphがどこで定義されているのかを調べると、CStageのメンバ変数のようです。
これは2要素固定の配列でありポインタではないので、ここがNULLになることは無いと思っていいでしょう。
そこで、次に CStage::DrawStage()がどこで使用されているかを調べます。
その結果は、提示されたコードで使用されているのはMain.cppの43行目のStage->DrawStage();のみのようです。
このStageがどこで定義されているかを調べると、この関数のローカル変数やCGameMainのメンバ変数には無く、グローバル変数で定義されているようです。
"Stage"で検索してみましたが、提示されたコードにStageに代入している場所は無いようです。
従って、CFmfMapなどのコードが無いので確定は出来ませんが、グローバル変数なのでNULLに初期化されているStageをそのままデリファレンスしてメンバ関数を呼び出したことでエラーになっている疑いがあります。
keito94 さんが書きました:例外処理を使って、indexが、適切かどうかを調べてみたら、変数indexに問題は見つかりませんでした。
コード:
try {
index = MapObj.GetValue(0, x, y);
if (index == NULL)
throw 1;
}
catch (int) {
int flag;
flag = MessageBox(
NULL,
TEXT("マップの値が不正です!!"),
TEXT("エラー!!"),
MB_ICONWARNING | MB_OK);
}
このコードはどういう意味ですか? (どういう意味だと思っていますか?)
indexはint型ですよね?どうしてNULL (0に近いが、通常はポインタとの比較やポインタ変数への代入にのみ用いる) と比較しているのですか?
indexが0ではいけないということは、0未満でも2以上でも範囲外へのアクセスが発生するので、indexは1であるはずという仕様なのですか?
[hr]
gcc/g++およびgdbというツールを用いると、ソースコードのどこでアクセス違反が発生したかがわかります。
これにより、エラーの原因を考えるヒントを得ることができます。
例えば、このコード(test.cpp)
コード:
#include <iostream>
struct Hoge {
int foo[2];
virtual void poyo() {}
void useFoo();
};
void Hoge::useFoo() {
std::cout << foo[1] << '\n';
}
Hoge* hogeValue;
void bar() {
hogeValue->useFoo();
}
int main() {
bar();
}
のどこでアクセス違反が発生するかを調べるには、
1. g++で-g3オプション(デバッグ情報を出力する)をつけてコンパイルする。
2. コンパイルしたプログラムを指定し、gdbを実行する。
3. runコマンドでプログラムを走らせる。
4. アクセス違反が出たら、どこで出たかが表示される。
5. この時、whereコマンドでそれがどこから呼び出されたかを調べることができる。
のようにするとわかります。
実行例
コード:
YUKI.N>g++ -g3 -static -o test test.cpp
YUKI.N>gdb test
GNU gdb (GDB) 7.6.1
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "mingw32".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from D:\gdbtest\test.exe...done.
(gdb) run
Starting program: D:\gdbtest/test.exe
[New Thread 5900.0x618]
Program received signal SIGSEGV, Segmentation fault.
0x004013ec in Hoge::useFoo (this=0x0) at test.cpp:10
10 std::cout << foo[1] << '\n';
(gdb) where
#0 0x004013ec in Hoge::useFoo (this=0x0) at test.cpp:10
#1 0x00401423 in bar () at test.cpp:16
#2 0x00401435 in main () at test.cpp:20
(gdb) quit
A debugging session is active.
Inferior 1 [process 5900] will be killed.
Quit anyway? (y or n) y
YUKI.N>