C++ 访问冲突写入错误。。。本原整数

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,

我正在DirectX11中创建一个heightmap,当我将地形高度指定为BitMapInfo标头中的高度时,我将获得一个访问冲突写入位置

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实际上等于正确的值。只是无法通过这一行。