ページ 11

アクセス領域外へアクセスする原因不明

Posted: 2009年5月27日(水) 00:30
by 迷走のギュス
デバッグや本など参照してやってみましたが、どうしても原因がわかりません。
先日お世話になったときに、すぐに解決させていただいたのでまた書き込ませていただきました。
ソースの参照をお願いします。
情報関係の先生に教えを乞っても管轄外なので教えられないと一蹴されて
このサイトだけが頼りです。
どなたかよろしくお願いします!


□質問内容□
アクセス領域外にアクセスしてしまう原因
どのポインタを修正すれば良いのか。

□実行結果□
ファイルの読み込みには成功するが、ファイルのポリゴンは正常な表示ではない

□環境□
OS:Windows XP コンパイラ名:visual studio 2008 PE
DX:Microsoft DirectX SDK (November 2008)
リンカ入力の依存ファイル:d3d9.lib d3dx9.lib winmm.lib

□エラーの内容□
0x4b6e799b で初回の例外が発生しました: 0xC0000005: 場所 0xcdcdcd7d に書き込み中にアクセス違反が発生しました。
0x4b6e799b でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xcdcdcd7d に書き込み中にアクセス違反が発生しました。
ネイティブ' はコード 0 (0x0) で終了しました。

Re:アクセス領域外へアクセスする原因不明

Posted: 2009年5月27日(水) 01:10
by BEMANI
>>迷走のギュスさん
既に他の方が解析に入っているかもしれませんが、
そのプロジェクトを実行する時にデバッグ実行(F5)するとどこかで止まったりしませんか?
もし止まったのならどの関数のここで止まりましたという情報があると解析する側としては助かるのではないかなぁ~と思います。

あわせて、ファイルのポリゴンは正常な表示ではないとありますが
単にエラーが出ているから正常に映らないかもしれませんが、映った画面を載せておくとさらに良いかもしれません。


上にも書いてますが、アクセス違反が出ているならデバッグ実行すると恐らくどこかで止まるはずです。
その止まった場所の変数をトレスしてみて下さい。
例えば、既にないものにアクセスしていたり、配列の要素数を超えてアクセスしていたりと
止まった部分(変数)が解れば原因が追求しやすいのではないかなぁ~と思います。

Re:アクセス領域外へアクセスする原因不明

Posted: 2009年5月27日(水) 01:59
by 迷走のギュス
ご指摘ありがとうございます!
デッバグ実行の際に止まる部分は→→→の箇所です!
//-----------------------------------------------------------------------------
//レンダーモデル関数
//-----------------------------------------------------------------------------
VOID RenderModel(int idx)
{
	if(g_models[idx].used == FALSE) 
		return ;

	for( DWORD i=0; i<g_models[idx].nummaterials; i=i+1 )
	{
		g_pd3dDevice->SetMaterial( &g_models[idx].pmaterials );
            →→→g_pd3dDevice->SetTexture( 0,g_models[idx].ptextures ); 
		g_models[idx].pmesh->DrawSubset(i);
	}
}


デバッグ実行したときに表示される
問題のありそうな呼び出し履歴は以下の4行です。
d3d9.dll!4b6e799b()
[下のフレームは間違っているか、または見つかりません。d3d9.dll に対して読み込まれたシンボルはありません。]
d3d9.dll!4b6f5a49()
my3dlib.exe!RenderModel(int idx=0) 行 117 + 0x2d バイト C++

ポリゴンに関してはサンプルを使わせていただいているので
画像をのせたいのですが著作権に影響があるかもしれないので
具体的に説明を加えておきます、すみません!

ポリゴンの状態は欠けたり黒くなるみたいです、
環境光とワールド変換行列が未設定だからだそうです!



よろしくお願いします!

Re:アクセス領域外へアクセスする原因不明

Posted: 2009年5月27日(水) 08:30
by toyo
int LoadModel(LPCTSTR filename)関数で
    for( int i=1; i<num; i=i+1 )
    {
        //マテリアルのコピー
        g_models[idx].pmaterials = d3dxMaterials.MatD3D;

        //アンビエント色の設定
        g_models[idx].pmaterials.Ambient = g_models[idx].pmaterials.Diffuse;

		//テクスチャの読み込み
        g_models[idx].ptextures = NULL;
        if( d3dxMaterials.pTextureFilename != NULL &&
            lstrlenA( d3dxMaterials.pTextureFilename ) > 0 )
        {
            if( FAILED( D3DXCreateTextureFromFileA( g_pd3dDevice,
                                                    d3dxMaterials.pTextureFilename,
                                                    &g_models[idx].ptextures ) ) )
            {
				MessageBox( NULL, _T("テクスチャが見つかりません"), _T("3D Lib"), MB_OK );
				return -1;
            }
        }
    }
iが1から始まっているためg_models[0].ptextures[0]の初期化が出来ていないようです

Re:アクセス領域外へアクセスする原因不明

Posted: 2009年5月27日(水) 16:31
by 迷走のギュス
おかげさまで解決することができました、
いつもありがとうございます!