这个C ++嵌套for循环有什么问题?

时间:2017-04-14 03:13:51

标签: c++ loops for-loop sfml

for (int pixel = 0; pixel < imgVector.size(); pixel++)
{
    for (int x = 0; x < image.getSize().x; x++)
    {
        for (int y = 0; y < image.getSize().y; y++)
        {
            pulledImage.setPixel(x, y, sf::Color::Color(imgVector.at(pixel)));
            pixel++;
        }
    }
}

所以在这段代码中我试图遍历一个向量并使用SFML将其内容放入一个图像中,但除非我有像素++;放在循环内部它会卡住,我觉得有像素++;在循环中是不正确的,可能会导致我的程序出现问题。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:2)

您正在递增pixel次,并最终使用越界索引访问imageVector

for (int pixel = 0; pixel < imgVector.size(); pixel++)
{
    for (int x = 0; x < image.getSize().x; x++)
    {
        for (int y = 0; y < image.getSize().y; y++)
        {
            pulledImage.setPixel(x, y, sf::Color::Color(imgVector.at(pixel)));

            // This line does not make sense.
            // Why do you need to increment pixel here?
            pixel++;
        }
    }
}

我猜你需要这样的东西:

size_t pixel = 0;
for (int x = 0; x < image.getSize().x; x++)
{
   for (int y = 0; y < image.getSize().y; y++, ++pixel)
   {
      assert(pixel < imgVector.size());
      pulledImage.setPixel(x, y, sf::Color::Color(imgVector.at(pixel)));
   }
}

答案 1 :(得分:0)

您应该记住,sf::Image::setPixel()并非真正用于更新整个图像。您经常锁定/解锁数据,与直接访问相比,这会带来糟糕的性能。

如果您想从原始图片数据创建sf::Image,我建议您使用其中一个sf::Image::create()重载:

sf::Image image;
image.create(width, height, reinterpret_cast<sf::Uint8*>(&imgVector[0]));

这应创建一个包含所有图像数据的新图像。 widthheight必须具有适当的尺寸。