Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 尝试包含纹理SDL2 c+时发生断言错误+;_C++_Sdl 2_Glew - Fatal编程技术网

C++ 尝试包含纹理SDL2 c+时发生断言错误+;

C++ 尝试包含纹理SDL2 c+时发生断言错误+;,c++,sdl-2,glew,C++,Sdl 2,Glew,我用SDL2制作了一个图形引擎,当我添加纹理时,它会显示一个错误: 然而,如果我不包括纹理,一切都很好 我也有理由相信,错误与IDE有关,因为我阅读了其他问题 我的IDE:VS 2017专业版 代码 运行() main()func调用run()方法 精灵的初始化: void targetSprite::init(float x, float y, float width, float height) { _x = x; _y = y; _width = width;

我用SDL2制作了一个图形引擎,当我添加纹理时,它会显示一个错误:


然而,如果我不包括纹理,一切都很好

我也有理由相信,错误与IDE有关,因为我阅读了其他问题

我的IDE:VS 2017专业版

代码

运行()

main()func调用run()方法

精灵的初始化:

void targetSprite::init(float x, float y, float width, float height)
{
    _x = x;
    _y = y;
    _width = width;
    _height = height;

    if (_vboID == 0) {
        glGenBuffers(1, &_vboID);
    }
    Vertex vertexData[6];
    //1st
    vertexData[0].setPos(_x + _width, _y + _height);
    vertexData[0].setUV(1.0f, 1.0f);

    vertexData[1].setPos(_x, _y + _height);
    vertexData[1].setUV(0.0f, 1.0f);

    vertexData[2].setPos(_x, _y);
    vertexData[2].setUV(0.0f, 0.0f);

    //2nd

    vertexData[3].setPos(_x, _y);
    vertexData[3].setUV(0.0f, 0.0f);

    vertexData[4].setPos(_x + _width, _y);
    vertexData[4].setUV(1.0f, 0.0f);

    vertexData[5].setPos(_x + _width, _y + _height);
    vertexData[5].setUV(1.0f, 1.0f);

    for (int i = 0; i < 6; i++) {
        vertexData[i].setColor(127, 127, 255, 255);
    }

    vertexData[1].setColor(255, 0, 255, 255);
    vertexData[4].setColor(0, 255, 255, 255);

    glBindBuffer(GL_ARRAY_BUFFER, _vboID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);

    glBindBuffer(GL_ARRAY_BUFFER, _vboID);
}
void targetSprite::init(浮动x、浮动y、浮动宽度、浮动高度)
{
_x=x;
_y=y;
_宽度=宽度;
_高度=高度;
如果(_vboID==0){
glGenBuffers(1,&u vboID);
}
顶点顶点数据[6];
//第一
vertexData[0].setPos(x+_宽度,y+_高度);
vertexData[0].setUV(1.0f,1.0f);
vertexData[1].setPos(x,y+height);
vertexData[1].setUV(0.0f,1.0f);
vertexData[2].setPos(x,y);
vertexData[2].setUV(0.0f,0.0f);
//第二
vertexData[3].setPos(x,y);
vertexData[3].setUV(0.0f,0.0f);
vertexData[4].setPos(x+width,y);
vertexData[4].setUV(1.0f,0.0f);
vertexData[5].setPos(x+_宽度,y+_高度);
vertexData[5].setUV(1.0f,1.0f);
对于(int i=0;i<6;i++){
vertexData[i].setColor(127、127、255、255);
}
vertexData[1].setColor(255,0,255,255);
vertexData[4].setColor(0,255,255,255);
glBindBuffer(GL_数组_BUFFER,_vboID);
glBufferData(GL_数组_缓冲区、sizeof(vertexData)、vertexData、GL_静态_绘图);
glBindBuffer(GL_数组_BUFFER,_vboID);
}
我发布这个是因为我相信错误在这里

但这并不是必需的,因为同样的代码在没有纹理的情况下运行

第10行的“顶点”是一个结构

我尝试将构建从调试更改为发布,但随后我遇到了.dll文件的问题

编辑:

这将调用向量中的错误:

GLTexture ImageLoader::loadPNG(std::string filePath)
{
    GLTexture texture = {};
    std::vector<unsigned char> out;
    unsigned long width;
    unsigned long height;
    std::vector<unsigned char> in;
    if (IOManager::readFileToBuffer(filePath, in) == false) { //read the texture to buffer
        fatalError2("FTB 1");
    }
    int errorCode = decodePNG(out, width, height, &(in[0]), in.size()); //error line
    if (errorCode != 0) {
        fatalError2("DPNG 1: " + std::to_string(errorCode));
    }

    glGenTextures(1, &(texture.id));
    glBindTexture(GL_TEXTURE_2D, texture.id);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &(out[0]));
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glGenerateMipmap(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, 0);

    texture.width = width;
    texture.height = height;

    return texture;
}
GLTexture ImageLoader::loadPNG(std::string文件路径)
{
GLTexture纹理={};
std::向量输出;
无符号长宽;
无符号长高度;
std::中的向量;
如果(IOManager::readFileToBuffer(filePath,in)==false){//将纹理读取到缓冲区
fatalError2(“FTB 1”);
}
int errorCode=decodePNG(out,width,height,&(in[0]),in.size();//错误行
如果(错误代码!=0){
fatalError2(“DPNG 1:+std::to_字符串(错误代码));
}
glGenTextures(1,&(texture.id));
glBindTexture(GL_TEXTURE_2D,TEXTURE.id);
GLTEXAGE2D(GL_纹理_2D,0,GL_RGBA,宽度,高度,0,GL_RGBA,GL_无符号_字节,&(输出[0]);
glTexParameteri(GL_纹理2D、GL_纹理包裹S、GL_重复);
glTexParameteri(GL_纹理2D、GL_纹理包裹、GL_重复);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
glTexParameteri(GL\u纹理\u 2D、GL\u纹理\u最小\u过滤器、GL\u线性\u MIPMAP\u线性);
GLGENATEMIPMAP(GL_纹理_2D);
glBindTexture(GL_TEXTURE_2D,0);
纹理宽度=宽度;
纹理高度=高度;
返回纹理;
}
第25行,然后返回到run()、main(),然后打开一个“sdl_windows_main.c not found”窗口

所以我想问题是那个文件在哪里

编辑2

我相信readFileToBuffer()方法负责填充“in”向量

bool IOManager::readFileToBuffer(std::string filePath,std::vector buffer)
{
std::ifstream文件(文件路径,std::ios::binary);
if(file.fail()){
perror(filePath.c_str());
返回false;
}
seekg(0,std::ios::end);
int fileSize=file.tellg();
seekg(0,std::ios::beg);
fileSize=fileSize-file.tellg();
调整缓冲区大小(文件大小);
read((char*)&(buffer[0]),fileSize;
file.close();
返回true;
}
解决方案是通过引用传递“缓冲区”

bool IOManager::readFileToBuffer(std::string filePath, std::vector<unsigned char>&buffer)
{
    std::ifstream file(filePath, std::ios::binary);
    if (file.fail()) {
        perror(filePath.c_str());
        return false;
    }
    file.seekg(0, std::ios::end);
    int fileSize = file.tellg();
    file.seekg(0, std::ios::beg);
    fileSize = fileSize - file.tellg();
    buffer.resize(fileSize);
    file.read((char *)&(buffer[0]), fileSize);
    file.close();
    return true;
}
´´´
bool-IOManager::readFileToBuffer(std::string-filePath、std::vector和buffer)
{
std::ifstream文件(文件路径,std::ios::binary);
if(file.fail()){
perror(filePath.c_str());
返回false;
}
seekg(0,std::ios::end);
int fileSize=file.tellg();
seekg(0,std::ios::beg);
fileSize=fileSize-file.tellg();
调整缓冲区大小(文件大小);
read((char*)&(buffer[0]),fileSize;
file.close();
返回true;
}
´´´

获取断言后,选择“重试以调试”,并查看调用堆栈,以找到错误在代码中的确切来源。您正在寻址一个超出范围的向量,并且所显示的代码中没有一个使用向量,因此这不是问题所在。考虑一下,我们可以看到所有可能是问题的代码。如果您不通过查看调试器来解决此问题,您可以通过将代码缩小到一些小的、可显示的内容来找到它。在错误框中,第二个按钮是“重试”。当您在调试器下运行应用程序时按下它,它将打开库代码中的失败行,但在底部应该有“调用堆栈”窗口,允许您查看导致此错误的代码调用。通过单击这些行,您可以导航到处于失败状态的代码并检查变量。您发布的错误是关于使用无效索引通过
运算符[]
访问
std::vector
,并且您发布的代码不包含
std::vector
。它会在第1733行打开一个“vector”文件。它还打印在调试器上:“GameProject.exe中0x0F7EE906(ucrtbased.dll)处的未处理异常:无效参数被传递给了认为无效参数是致命的函数。”我知道,您应该导航到“调用堆栈”窗口中的调用代码,以查看为什么使用不正确的索引调用它。我编辑了这个问题
bool IOManager::readFileToBuffer(std::string filePath, std::vector<unsigned char> buffer)
{
    std::ifstream file(filePath, std::ios::binary);
    if (file.fail()) {
        perror(filePath.c_str());
        return false;
    }
    file.seekg(0, std::ios::end);
    int fileSize = file.tellg();
    file.seekg(0, std::ios::beg);
    fileSize = fileSize - file.tellg();
    buffer.resize(fileSize);
    file.read((char *)&(buffer[0]), fileSize);
    file.close();
    return true;
}
bool IOManager::readFileToBuffer(std::string filePath, std::vector<unsigned char>&buffer)
{
    std::ifstream file(filePath, std::ios::binary);
    if (file.fail()) {
        perror(filePath.c_str());
        return false;
    }
    file.seekg(0, std::ios::end);
    int fileSize = file.tellg();
    file.seekg(0, std::ios::beg);
    fileSize = fileSize - file.tellg();
    buffer.resize(fileSize);
    file.read((char *)&(buffer[0]), fileSize);
    file.close();
    return true;
}
´´´