ページ 11

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

Posted: 2016年3月18日(金) 20:36
by うぶ
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宣言内の変数宣言を削除し、関数内で変数宣言を行うとそのようなことは起こりません。
これは何故でしょうか?

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

Posted: 2016年3月18日(金) 22:05
by みけCAT
確保された領域の外への書き込みが行われているかもしれません。
Class内での宣言と関数内での宣言でたまたま変数のメモリ上の配置が違うのかもしれません。

2個目のfreadの時にOffsetが30以上62以下であることを、3個目のfreadの時にBitSizeが0以上32以下であることを確認してください。
freadの第三引数は符号なし整数なので、「負の数」を渡してはいけません。

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

Posted: 2016年3月19日(土) 14:37
by うぶ
みけ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);
と修正したところ、無事に動きました。
ありがとうございました。