for循环中未处理的异常 [英] Unhandled exception in for loop

查看:122
本文介绍了for循环中未处理的异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试为我的OpenGL项目创建两个纹理.最初,我分别创建了纹理,并且效果很好.为了不重复我自己,我决定尝试将它们设置为数组,并使用for循环执行两次步骤.

I'm trying to create two textures for my OpenGL project. Initially i created the textures seperately and this worked perfectly fine. Not to repeat myself, I decided to attempt to make them as an array and use a for loop to perform the steps twice.

unsigned int textures[2];
int width, height, nrChannels;
unsigned char *data = stbi_load("C:\\Users\\A\\Desktop\\wall.jpg", &width, &height, &nrChannels, 0);
glGenTextures(2, textures);
for (int i = 0; i < 2; i++)
{
    glBindTexture(GL_TEXTURE_2D, (i == 0) ? textures[0] : textures[1]);
    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_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    if (data)
    {
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, (i == 0) ? GL_RGB : GL_RGBA, GL_UNSIGNED_BYTE, data);
        glGenerateMipmap(GL_TEXTURE_2D);
        if (i == 1)
        data = stbi_load("C:\\Users\\A\\Desktop\\awesomeface.png", &width, &height, &nrChannels, 0);
    }
    else
    {
        std::cout << "Failed to load texture!" << std::endl;
    }
}

在第13行(glTexImage2D)上,我收到以下未处理的异常:

On line 13 (glTexImage2D), I recive the following unhandled exception:

LearnOpenGL.exe中0x03EE8893(ig9icd32.dll)的未处理异常:0xC0000005:访问冲突读取位置0x00942000.

Unhandled exception at 0x03EE8893 (ig9icd32.dll) in LearnOpenGL.exe: 0xC0000005: Access violation reading location 0x00942000.

基本上我有3个问题,是什么导致此错误?我该如何解决?反正这是一个不好的方法吗?

Basically I have 3 questions, what is causing this error? How can i fix it? And is this a bad way to go about doing this anyway?

这是我的旧代码,可以很好地工作:

This was my old code, which works perfectly fine:

unsigned int texture1, texture2;
// texture 1
// ---------
glGenTextures(1, &texture1);
glBindTexture(GL_TEXTURE_2D, texture1);
// set the texture wrapping parameters
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);   // set texture wrapping to GL_REPEAT (default wrapping method)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
// set texture filtering parameters
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// load image, create texture and generate mipmaps
int width, height, nrChannels;
stbi_set_flip_vertically_on_load(true); // tell stb_image.h to flip loaded texture's on the y-axis.
// The FileSystem::getPath(...) is part of the GitHub repository so we can find files on any IDE/platform; replace it with your own image path.
unsigned char *data = stbi_load("C:\\Users\\A\\Desktop\\wall.jpg", &width, &height, &nrChannels, 0);
if (data)
{
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
    glGenerateMipmap(GL_TEXTURE_2D);
}
else
{
    std::cout << "Failed to load texture" << std::endl;
}
stbi_image_free(data);
// texture 2
// ---------
glGenTextures(1, &texture2);
glBindTexture(GL_TEXTURE_2D, texture2);
// set the texture wrapping parameters
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);   // set texture wrapping to GL_REPEAT (default wrapping method)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
// set texture filtering parameters
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// load image, create texture and generate mipmaps
data = stbi_load("C:\\Users\\A\\Desktop\\awesomeface.png", &width, &height, &nrChannels, 0);
if (data)
{
    // note that the awesomeface.png has transparency and thus an alpha channel, so make sure to tell OpenGL the data type is of GL_RGBA
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
    glGenerateMipmap(GL_TEXTURE_2D);
}
else
{
    std::cout << "Failed to load texture" << std::endl;
}
stbi_image_free(data);

推荐答案

请阅读您正在使用的库的手册.

Please read the manuals of the libraries you're using.

使用机顶盒加载图像写道:

stbi_load()的第五个参数指定每个像素要使用的8位分量数.可以将其设置为以下四个选项之一:

The fifth parameter of stbi_load() specifies the number of 8-bit components per pixel to use. It can be set to one of following four options:

STBI_grey = 1

STBI_grey = 1

STBI_grey_alpha = 2

STBI_grey_alpha = 2

STBI_rgb = 3

STBI_rgb = 3

STBI_rgb_alpha = 4

STBI_rgb_alpha = 4

如果将0用作第五个参数,则stbi_load()将使用在代码中未初始化的nrChannels,从而导致未定义的行为.

If you pass 0 as the fifth parameter stbi_load() will use your nrChannels which is uninitialized in your code and thuss causes undefined behaviour.

这篇关于for循环中未处理的异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆