变量的值根据矢量值而变化

时间:2017-06-16 15:48:14

标签: c++ arrays opengl glut

我通过函数int Vetor[33];的参数发送数组MontaVetorVerticalOtimizado(x, y, Vetor),在这里填充数组,问题是在填充数组后,函数OtimizaVerticalDentina()的所有变量都被签名使用数组的值,它似乎令人困惑,所以我在调试时添加了图像,使其更容易理解:

第一项功能

void OtimizaVerticalDentina() {
    int Vetor[33];
    int x, y;
    for (x = 1; x < NewImage.SizeX() - 1; x++)
    {
        for (y = 10; y < NewImage.SizeY() - 10; y++)
        {
            MontaVetorVerticalOtimizado(x, y, Vetor);
            VerificaIntensidadeVetorVerticalOtimizado(Vetor);
            if (bPreenche) {
                NewImage.DrawPixel(x, y, 255, 255, 255);
            } else {
                NewImage.DrawPixel(x, y, 0, 0, 0);
                bPreenche = true;
            }
        }

    }
}

第二项功能

void MontaVetorVerticalOtimizado(int Px, int Py, int Vetor[33])
{
    int x, y;
    int i = 0;
    unsigned char r, g, b;
    for(x = Px - 1; x <= Px + 1; x++)
    {
        for(y = Py - 10; y <= Py + 10; y++)
        {
           NewImage.ReadPixel(x, y, r, g, b);
           Vetor[i] = r;
           i++;
        }
    }
}

注意:

ImageClass NewImage; // global

填充之前,数组变量具有正常值 enter image description here

填充数组后,变量具有另一个值(向量中添加的值)enter image description here

*我在第一个测试方法中创建了其他变量,它们也发生了变化,有没有人知道可能会发生什么?

1 个答案:

答案 0 :(得分:1)

我能找到的唯一解释是你有一个缓冲区溢出。那就是你正在写这个数组(Vetor),这个数组不够大,碰巧在这个过程中覆盖了不相关的内存。在这种情况下,具体而言,您将覆盖调用函数的变量xy的值。

我有演示here

#include <iostream>

void bar(int* arr)
{
    for (int i = 0; i <= 35; i++) arr[i] = 255;
}

void foo()
{
    int arr[33];
    int x;
    for (x = 0; x < 5; x++)
    {
        std::cout << x << '\n';
        bar(arr);
        std::cout << x << '\n';
    }
}

int main()
{
    foo();
    return 0;
}

这会产生:0 255并立即终止,因为循环变量被覆盖并且后续x < 5检查失败。你要么必须增加数组的大小(如果它太小了),要么确保你在它的范围内索引。