主题:有一个内存方面的问题请教大家,请大家帮忙看一下。谢谢
这是在DOS下的TC环境中的BMP图片显示的一个函数。
现在有个问题,这个软件是在PC104 的DOS环境下跑的,但是图片在显示10次之后,就会发生软件死机跑飞现象。
怀疑是由内存引起的。请大家看下这样申请和释放内存正确吗?
void DisplayBMP()
{
long i,j;
long WBytes;
int Colors;
long Height,Width;
FILE *fpbmp;
char *Temp=NULL;
typedef struct tagBITMAPFILEHEADER
{
unsigned int bfType;
unsigned long bfSize;
unsigned int bfReserved1;
unsigned int bfReserved2;
unsigned long bfOffBits;
}BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER
{
unsigned long biSize;
long biWidth;
long biHeight;
unsigned int biPanes;
unsigned int biBitCount;
unsigned long biCompression;
unsigned long biSizeImage;
long biXPelsPerMeter;
long biYPelsPerMeter;
unsigned long biClrUsed;
unsigned long biClrImportant;
}BITMAPINFOHEADER;
typedef struct tagRGBQUAD
{
unsigned char rgbBlue;
unsigned char rgbGreen;
unsigned char rgbRed;
unsigned char rgbReserved;
}RGBQUAD;
typedef struct tagBITMAPINFO
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[];
}BITMAPINFO;
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
unsigned char SrcData,data;
if((fpbmp=fopen("Rochen.bmp","rb"))==NULL)
{
/*Exit("Can Not Open The File.\n");*/
}
fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpbmp);
if(bfh.bfType!='M'*256+'B')
{
/*Exit("This Is Not A Bmp File.\n");*/
}
fread(&bih,sizeof(BITMAPINFOHEADER),1,fpbmp);
Height=bih.biHeight;
Width=bih.biWidth;
WBytes=WidthBytes(Width,bih.biBitCount);
Colors=1<<bih.biBitCount;
if(!(Colors==16||Colors==2))
{
/*Exit("This Programme Only For 16 Colors Bitmap.\n");*/
}
/*Temp = calloc(10, sizeof(RGBQUAD));*//*申请颜色内存*/
Temp = (RGBQUAD *)malloc(Width*sizeof(RGBQUAD)); /*申请内存空间*/
fread(Temp,sizeof(RGBQUAD),Colors,fpbmp);
/*printf("%d %d",'\f','\t');*/
for(i=Height-1;i>=0;i--)
{
fseek(fpbmp,54+Colors*sizeof(RGBQUAD)+i*WBytes,SEEK_SET);
for(j=MOVEX;j<Width+MOVEX;j++)/*图片X轴方向起始坐标*/
{
switch(Colors)
{
case 16:
if(j%2==0)
{
fread(&SrcData,1,1,fpbmp);
data=SetPalette(Colors,SrcData/16);
putpixel(j,Height-1-i+MOVEY,data);/*图片Y轴方向起始坐标*/
}
else
{
data=SetPalette(Colors,SrcData%16);
putpixel(j,Height-1-i+MOVEY,data);
}
break;
case 2:
if(j%8==0)
{
fread(&SrcData,1,1,fpbmp);
data=SetPalette(Colors,(SrcData>>7)%2);
putpixel(j,Height-1-i+MOVEY,data);
}
else
{
data=SetPalette(Colors,(SrcData>>(7-j%8))%2);
putpixel(j,Height-1-i+MOVEY,data);
}
}
}
}
/*getch();*/
free(Temp);/*释放掉颜色内存*/
close(fpbmp); /*关闭文件*/
}
现在有个问题,这个软件是在PC104 的DOS环境下跑的,但是图片在显示10次之后,就会发生软件死机跑飞现象。
怀疑是由内存引起的。请大家看下这样申请和释放内存正确吗?
void DisplayBMP()
{
long i,j;
long WBytes;
int Colors;
long Height,Width;
FILE *fpbmp;
char *Temp=NULL;
typedef struct tagBITMAPFILEHEADER
{
unsigned int bfType;
unsigned long bfSize;
unsigned int bfReserved1;
unsigned int bfReserved2;
unsigned long bfOffBits;
}BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER
{
unsigned long biSize;
long biWidth;
long biHeight;
unsigned int biPanes;
unsigned int biBitCount;
unsigned long biCompression;
unsigned long biSizeImage;
long biXPelsPerMeter;
long biYPelsPerMeter;
unsigned long biClrUsed;
unsigned long biClrImportant;
}BITMAPINFOHEADER;
typedef struct tagRGBQUAD
{
unsigned char rgbBlue;
unsigned char rgbGreen;
unsigned char rgbRed;
unsigned char rgbReserved;
}RGBQUAD;
typedef struct tagBITMAPINFO
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[];
}BITMAPINFO;
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
unsigned char SrcData,data;
if((fpbmp=fopen("Rochen.bmp","rb"))==NULL)
{
/*Exit("Can Not Open The File.\n");*/
}
fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpbmp);
if(bfh.bfType!='M'*256+'B')
{
/*Exit("This Is Not A Bmp File.\n");*/
}
fread(&bih,sizeof(BITMAPINFOHEADER),1,fpbmp);
Height=bih.biHeight;
Width=bih.biWidth;
WBytes=WidthBytes(Width,bih.biBitCount);
Colors=1<<bih.biBitCount;
if(!(Colors==16||Colors==2))
{
/*Exit("This Programme Only For 16 Colors Bitmap.\n");*/
}
/*Temp = calloc(10, sizeof(RGBQUAD));*//*申请颜色内存*/
Temp = (RGBQUAD *)malloc(Width*sizeof(RGBQUAD)); /*申请内存空间*/
fread(Temp,sizeof(RGBQUAD),Colors,fpbmp);
/*printf("%d %d",'\f','\t');*/
for(i=Height-1;i>=0;i--)
{
fseek(fpbmp,54+Colors*sizeof(RGBQUAD)+i*WBytes,SEEK_SET);
for(j=MOVEX;j<Width+MOVEX;j++)/*图片X轴方向起始坐标*/
{
switch(Colors)
{
case 16:
if(j%2==0)
{
fread(&SrcData,1,1,fpbmp);
data=SetPalette(Colors,SrcData/16);
putpixel(j,Height-1-i+MOVEY,data);/*图片Y轴方向起始坐标*/
}
else
{
data=SetPalette(Colors,SrcData%16);
putpixel(j,Height-1-i+MOVEY,data);
}
break;
case 2:
if(j%8==0)
{
fread(&SrcData,1,1,fpbmp);
data=SetPalette(Colors,(SrcData>>7)%2);
putpixel(j,Height-1-i+MOVEY,data);
}
else
{
data=SetPalette(Colors,(SrcData>>(7-j%8))%2);
putpixel(j,Height-1-i+MOVEY,data);
}
}
}
}
/*getch();*/
free(Temp);/*释放掉颜色内存*/
close(fpbmp); /*关闭文件*/
}