C++ 访问冲突写入错误。。。本原整数
我正在DirectX11中创建一个heightmap,当我将地形高度指定为BitMapInfo标头中的高度时,我将获得一个访问冲突写入位置C++ 访问冲突写入错误。。。本原整数,c++,windows,directx,C++,Windows,Directx,我正在DirectX11中创建一个heightmap,当我将地形高度指定为BitMapInfo标头中的高度时,我将获得一个访问冲突写入位置 bool HMTerrain::LoadHeightMap(char* filename) { FILE* filePtr; int error; unsigned int count; BITMAPFILEHEADER bitmapFileHeader; BITMAPINFOHEADER bitmapInfoHeader; int imageSize,
bool HMTerrain::LoadHeightMap(char* filename)
{
FILE* filePtr;
int error;
unsigned int count;
BITMAPFILEHEADER bitmapFileHeader;
BITMAPINFOHEADER bitmapInfoHeader;
int imageSize, i, j, k, index;
unsigned char* bitmapImage;
unsigned char height;
// Open the height map file in binary.
error = fopen_s(&filePtr, filename, "rb");
if (error != 0)
{
return false;
}
// Read in the file header.
count = fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, filePtr);
if (count != 1)
{
return false;
}
// Read in the bitmap info header.
count = fread(&bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, filePtr);
if (count != 1)
{
return false;
}
// Save the dimensions of the terrain.
_pTerrainWidth = bitmapInfoHeader.biWidth; // THIS IS THE BREAK
_pTerrainHeight = bitmapInfoHeader.biHeight;
// Calculate the size of the bitmap image data.
imageSize = _pTerrainWidth * _pTerrainHeight * 3;
// Allocate memory for the bitmap image data.
bitmapImage = new unsigned char[imageSize];
if (!bitmapImage)
{
return false;
}
// Move to the beginning of the bitmap data.
fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET);
// Read in the bitmap image data.
count = fread(bitmapImage, 1, imageSize, filePtr);
if (count != imageSize)
{
return false;
}
// Close the file.
error = fclose(filePtr);
if (error != 0)
{
return false;
}
// Create the structure to hold the height map data.
_pHeightMap = new HeightMapType[_pTerrainWidth * _pTerrainHeight];
if (!_pHeightMap)
{
return false;
}
// Initialize the position in the image data buffer.
k = 0;
// Read the image data into the height map.
for (j = 0; j<_pTerrainHeight; j++)
{
for (i = 0; i<_pTerrainWidth; i++)
{
height = bitmapImage[k];
index = (_pTerrainHeight * j) + i;
_pHeightMap[index].x = (float)i;
_pHeightMap[index].y = (float)height;
_pHeightMap[index].z = (float)j;
k += 3;
}
}
// Release the bitmap image data.
delete[] bitmapImage;
bitmapImage = 0;
return true;
}
///////////////////////// HEADER FILE /////////////////////////
class HMTerrain
{
private:
INT _pTerrainWidth, _pTerrainHeight;
int _pVertexCount, _pIndexCount;
ID3D11Buffer* _pVertexBuffer, *_pIndexBuffer;
HeightMapType* _pHeightMap;
bool LoadHeightMap(char*);
bool InitialiseBuffers(ID3D11Device*);
void NormalizeHeightMap();
void ShutdownHeightMap();
void ShutdownBuffers();
void RenderBuffers(ID3D11DeviceContext*);
public:
HMTerrain();
HMTerrain(const HMTerrain&);
~HMTerrain();
bool Initialise(ID3D11Device*, char*);
void Shutdown();
void Render(ID3D11DeviceContext*);
int GetIndexCount();
};
boolhmterrain::LoadHeightMap(char*filename)
{
文件*filePtr;
整数误差;
无符号整数计数;
BITMAPFILEHEADER BITMAPFILEHEADER;
BitMapInfo标头BitMapInfo标头;
int imageSize,i,j,k,index;
未签名字符*位图图像;
无符号字符高度;
//以二进制打开高度贴图文件。
错误=fopen_s(&filePtr,文件名,“rb”);
如果(错误!=0)
{
返回false;
}
//读入文件头。
count=fread(&bitmapFileHeader,sizeof(bitmapFileHeader),1,filePtr);
如果(计数!=1)
{
返回false;
}
//读取位图信息标题。
count=fread(&BitMapInfo头,sizeof(BitMapInfo头),1,filePtr);
如果(计数!=1)
{
返回false;
}
//保存地形的尺寸。
_pTerrainWidth=BitMapInfo头.biWidth;//这是中断
_pTerrainHeight=BitMapInfo标头.biHeight;
//计算位图图像数据的大小。
图像大小=_-pterainwidth*_-pterainheight*3;
//为位图图像数据分配内存。
bitmapImage=新的无符号字符[imageSize];
如果(!bitmapImage)
{
返回false;
}
//移动到位图数据的开头。
fseek(filePtr,bitmapFileHeader.bfOffBits,SEEK_SET);
//读取位图图像数据。
count=fread(bitmapImage,1,imageSize,filePtr);
如果(计数!=图像大小)
{
返回false;
}
//关闭文件。
错误=fclose(文件服务器);
如果(错误!=0)
{
返回false;
}
//创建用于保存高度贴图数据的结构。
_pHeightMap=新的HeightMapType[_pTerrainWidth*_pTerrainHeight];
如果(!\u pHeightMap)
{
返回false;
}
//初始化图像数据缓冲区中的位置。
k=0;
//将图像数据读入高度图。
对于(j=0;jIf\u pTerrainWidth
是一个int
,你不应该在它前面加上p
-它看起来像是一个指针。从你包含的一行代码中,不可能分辨出什么是错的。你试过调试你的代码吗?离题:在东西的字体上加下划线可能会导致与r发生不幸的冲突在这里阅读更多的内容:听起来像<>代码> pTrRunStult被声明为某个对象的成员,您引用的代码行在该对象的成员函数内,并使用未初始化的指针来调用该成员函数。如果我估计不正确,请考虑显示相关的PA。您的代码的rts可能会证明我不正确。@xxbbcc有人告诉我这是用于私有变量的-哎呀,我之前试过几行调试,但在这一行中断了。biWidth实际上等于正确的值。只是无法通过这一行。如果\u pTerrainWidth
是int
,您不应该在它前面加e> p
-它看起来像是一个指针。从您包含的一行代码中,无法判断出错误。您是否尝试过调试您的代码?离题:在事物的字体上粘贴下划线可能会导致与保留项发生不幸的冲突。阅读更多信息:听起来像\u pTerrainWidth
已声明为f某个对象,并且引用的代码行位于该对象的成员函数内,并且使用未初始化的指针来调用该成员函数。如果我估计不正确,请考虑显示您的代码的相关部分,这可能证明我不正确。哎呀,我之前试过几行调试,结果在这一行中断了。biWidth实际上等于正确的值。只是无法通过这一行。