Class内における変数について

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

Class内における変数について

#1

投稿記事 by うぶ » 9年前

Microsoft Visual C++ 2010 Expressにてコンソールプログラムを作成しています。

以下のようなクラス宣言(?)をBMP.hで行い、

コード:

class C_BMP
{
	FILE *lf;
	unsigned char StrBuf[32];
	int OffSet, BitSize;
public:
	void Init( char PicData[][250] );
};
以下の関数を作成しました。

コード:

void C_BMP::Init( char PicData[][250] )
{
	int i = 0;
	int j = 0;
	OffSet = 0;
	BitSize = 0;
	memset( StrBuf, 0, 32 );

	fopen_s(&lf, "test.bmp", "rb");
		fread(StrBuf, sizeof( unsigned char ), 30, lf);
		for (i=0 ; i<4 ; i++)
		{
			OffSet += StrBuf[i+10]*pow(256.0,i);
		}
		for (i=0 ; i<2 ; i++)
		{
			BitSize += StrBuf[i+28]*pow(256.0,i);
		}
		BitSize /= 8;
		fread(StrBuf, sizeof( unsigned char ), OffSet-30, lf);
		for (i=0 ; i<250 ; i++ )
		{
			for (j=0 ; j<250 ; j++ )
			{
				fread(StrBuf, sizeof( unsigned char ), BitSize, lf);
				if ( (StrBuf[0]+4*StrBuf[1]+2*StrBuf[2])/7 != 255 )
				{
					PicData[249-i][249-j] = 1;
				} else
				{
					PicData[249-i][249-j] = 0;
				}
			}
		}
	fclose(lf);
}
これを実行すると、最初に出てくるOffSet、BitSizeは想定通りの値となります。
しかし、freadを通過すると、OffSetは65280に、BitSizeは-1になってしまいます。

一方、Class宣言内の変数宣言を削除し、関数内で変数宣言を行うとそのようなことは起こりません。
これは何故でしょうか?

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

Re: Class内における変数について

#2

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

確保された領域の外への書き込みが行われているかもしれません。
Class内での宣言と関数内での宣言でたまたま変数のメモリ上の配置が違うのかもしれません。

2個目のfreadの時にOffsetが30以上62以下であることを、3個目のfreadの時にBitSizeが0以上32以下であることを確認してください。
freadの第三引数は符号なし整数なので、「負の数」を渡してはいけません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

うぶ

Re: Class内における変数について

#3

投稿記事 by うぶ » 9年前

みけCAT さんが書きました:2個目のfreadの時にOffsetが30以上62以下であること
freadの値が138だったので、

コード:

		while( OffSet-30 - 30*i > 30 )
		{
			fread(StrBuf, sizeof( unsigned char ), 30, lf);
			i++;
		}
		fread(StrBuf, sizeof( unsigned char ), OffSet-30-30*i, lf);
と修正したところ、無事に動きました。
ありがとうございました。

閉鎖

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