我的函数每次都返回一个不同的值,即使没有任何随机值

时间:2014-03-29 03:51:25

标签: java android corruption

我有以下代码。它用于计算在OpenGL中使用的纹理位置,但是,这是无关紧要的。它第一次完美运行,但只是第一次。

public static float[] createTexturePositions(final int width, final int height)
{
    float[] positions = new float[width * height * 12];

    // Range: 0 - 1
    float dx = 1f / width;
    float dy = 1f / height;

    float y = 0f;

    int i = 0;

    for (int indexY = 0; indexY < height; indexY++)
    {
        float x = 0f;

        for (int indexX = 0; indexX < width; indexX++)
        {
            float top    = y;
            float left   = x;
            float right  = x + dx;
            float bottom = y + dy;

            // p1   p2
            // p3

            positions[i     ] = left;
            positions[i +  1] = top;

            positions[i +  2] = right;
            positions[i +  3] = top;

            positions[i +  4] = left;
            positions[i +  5] = bottom;

            //      p4
            // p5   p6

            positions[i +  6] = right;
            positions[i +  7] = top;

            positions[i +  8] = left;
            positions[i +  9] = bottom;

            positions[i + 10] = right;
            positions[i + 11] = bottom;

            x += dx;
            i += 12;
        }

        y += dy;
    }

    return positions;
}

现在,发生的事情毫无意义。 - 即使输入完全相同,此函数也会返回不同的值。 - 随机出错 - 错误不会在第一次发生时发生,但通常在第4次呼叫时,数据与之前的呼叫不匹配。 - 值相差很多,我得到:0.85714287 vs 1.1417698E35,索引i = 565.我的输入值是7,7。 - 在上述情况下,第二个值是无意义的值(e ^ 35)。但这是从头开始生成的价值。 I.E.它应该没有被修改的方式。 - 我只返回数组的副本,从而确保被测试的是我认为的那个! - 舍入误差不重要,因为它们每次都应该是相同的,即使它们不同,它们至少应该在值上相似。

在我看来,这似乎是一个数据损坏问题。像某人或某事正在修改我的数据!是否存在某种堆栈堆冲突问题或者我不知道的奇怪的事情?

更新1:

我发现添加以下代码:

            testValue( top    );
            testValue( left   );
            testValue( right  );
            testValue( bottom );

private static void testValue(float value)
{
    if (value < 0f || value > 1.01f)    throw new RuntimeException("Error! Value is Invalid");
}

可以防止问题发生! testValue函数当然放在原始函数之后,在确定值之后直接调用testValue。

更新2:

我可以通过注释/取消注释testValue代码来打开/关闭问题。再一次,这没有任何意义,我想我会把这些代码放在那里,因为它正在解决我的问题!

0 个答案:

没有答案