アクセス違反について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Suikaba
記事: 194
登録日時: 14年前

アクセス違反について

#1

投稿記事 by Suikaba » 14年前

ちょっと困ったことがあります。以下のコードですが・・・

コード:

#include "GameLib/Framework.h"
#include <fstream>
using namespace std;

void readFile( char** buffer, int* size, const char* filename );
unsigned getUnsigned( const char* );

bool gFirst = true;
int gImageWidth = 0;
int gImageHeight = 0;
unsigned* gImageData = 0;

namespace GameLib{
	void Framework::update(){
		if( gFirst ){
			gFirst = false;
			char* buffer = 0;
			int size = 0;
			readFile( &buffer, &size, "bar.dds" );
			gImageHeight = getUnsigned( &( buffer[ 12 ] ) );
			gImageWidth = getUnsigned( &( buffer[ 16 ] ) );
			gImageData = new unsigned[ gImageWidth * gImageHeight ];
			for( int i = 0; i < gImageWidth * gImageHeight; ++i ){
				gImageData[ i ] = getUnsigned( &( buffer[ 128 + i*4 ] ) );
			}
		}
		unsigned* vram = videoMemory();
		unsigned windowWidth = width();
		for( int y = 0; y < gImageHeight; ++y ){
			for( int x = 0; x < gImageWidth; ++x ){
				vram[ y * windowWidth + x ] = gImageData[ y * gImageWidth + x ];
			}
		}
	}
}

// ファイル読み込み
void readFile( char** buffer, int* size, const char* filename ){
	ifstream in( filename, ifstream::binary );
	if( !in ){
		*buffer = 0;
		*size = 0;
	}else{
		in.seekg( 0, ifstream::end );
		*size = static_cast< int >( in.tellg() );
		in.seekg( 0, ifstream::beg );
		*buffer = new char[ *size ];
		in.read( *buffer, *size );
	}
}

// unsgined取り出し
unsigned getUnsigned( const char* p ){
	const unsigned char* up;
	up = reinterpret_cast< const unsigned char* >( p );
	unsigned r = up[ 0 ];
	r |= up[ 1 ] << 8;
	r |= up[ 2 ] << 16;
	r |= up[ 3 ] << 24;
	return r;
}

ThirdGame.exe の 0x00477b37 で初回の例外が発生しました: 0xC0000005: 場所 0x0000000c を読み込み中にアクセス違反が発生しました。
ThirdGame.exe の 0x00477b37 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x0000000c を読み込み中にアクセス違反が発生しました。

というエラーが出てしまいます。調べてみましたが、ちょっと分かりませんでした。
なんとなくは分かるのですが・・・

ちなみに Visual Studio 2008 でやってます。
どうかよろしくお願いします。

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: アクセス違反について

#2

投稿記事 by bitter_fox » 14年前

これが原因かは解りませんが、

コード:

////////////////////////////////////////////////////////////////////////////////
            readFile( &buffer, &size, "bar.dds" );
            gImageHeight = getUnsigned( &( buffer[ 12 ] ) );
            gImageWidth = getUnsigned( &( buffer[ 16 ] ) );
            gImageData = new unsigned[ gImageWidth * gImageHeight ];
            for( int i = 0; i < gImageWidth * gImageHeight; ++i ){
                gImageData[ i ] = getUnsigned( &( buffer[ 128 + i*4 ] ) );
            }
////////////////////////////////////////////////////////////////////////////////
void readFile( char** buffer, int* size, const char* filename ){
    ifstream in( filename, ifstream::binary );
    if( !in ){
        *buffer = 0;
        *size = 0;
    }
////////////////////////////////////////////////////////////////////////////////
もし、readFile関数で、ファイルが開けなかったら、bufferにヌルポインタが入ってることになるので。
次の、getUnsigned関数で配列外を参照することになると思うのですが・・・

Suikaba
記事: 194
登録日時: 14年前

Re: アクセス違反について

#3

投稿記事 by Suikaba » 14年前

おそらくそうですね(笑)
間違って違うとこに保存してました。

開けなかた時のしょりをきちんと書いておくべきですね。
ありがとうございました。

Suikaba
記事: 194
登録日時: 14年前

Re: アクセス違反について

#4

投稿記事 by Suikaba » 14年前

解決しています。

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: アクセス違反について

#5

投稿記事 by bitter_fox » 14年前

それから、このコードを見る限りでは、bufferの解放およびファイルストリームが閉じられてないのですが、大丈夫ですか??

閉鎖

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