C# 数组索引越界错误

6

全面披露: 这是一份作业任务。

这让我感到很烦。我正在编写离散余弦变换函数,并且基本上已经完成,但是我遇到了一个IndexOutOfRange异常。

以下是代码:

static int[][] DiscreteCosineTransform(int[][] pIn)
        {
            int[][] cosP = pIn;
            double SumCosP = 0;
            double Cx = 0;
            double Cy = 0;
            Console.WriteLine("Discrete Cosine Transformed Array:");
            for(int i = 0; i < 8; i++)
            {
                if (i == 0)
                    Cx = 1 / Math.Sqrt(2);
                else
                    Cx = 1;
                for(int j = 0; j < 8; i++)
                {
                    if (j == 0)
                        Cy = 1 / Math.Sqrt(2);
                    else
                        Cy = 1;

                    for (int x = 0; x < 8; x++)
                    {
                        for (int y = 0; y < 8; y++)
                        {
                            SumCosP += cosP[x][y] * Math.Cos(((2 * x + 1) * i * Math.PI) / 16) * Math.Cos(((2 * y + 1) * j * Math.PI) / 16);
                        }
                    }
                    pIn[i][j] = (int)(0.25 * Cx * Cy * SumCosP);
                    Console.Write(" " + pIn[i][j] + " ");
                }
                Console.WriteLine();
            }
            Console.WriteLine();
            return pIn;
        }

其中pIn是:

int[][] P = new int[][]
            {
                new int[]{10,10,10,10,10,10,10,10},
                new int[]{10,20,20,20,20,20,20,10},
                new int[]{10,20,30,30,30,30,20,10},
                new int[]{10,20,30,40,40,30,20,10},
                new int[]{10,20,30,40,40,30,20,10},
                new int[]{10,20,30,30,30,30,20,10},
                new int[]{10,20,20,20,20,20,20,10},
                new int[]{10,10,10,10,10,10,10,10}
            };

2
哪一行代码抛出了异常? - Robert Harvey
3个回答

15

这行文字

for(int j = 0; j < 8; i++) 

应该阅读

for(int j = 0; j < 8; j++) 

                      ^

+1 ... 哎呀!这些事情经常发生。感谢您帮我修复这个愚蠢的错误! - Riddari
4
不要只是修正错误。问问自己“是什么因素导致我犯了这个错误,如何才能永远不再犯同样的错误?”导致错误的因素是使用了毫无意义并且在视觉上几乎相同的变量名 i 和 j。你能想出更具描述性且不容易混淆的 i、j、x 和 y 的名称吗? - Eric Lippert
我同意Eric的观点。像 i、j、x 和 y 这样的变量名称会使得发现问题变得更加困难,特别是在像 Courier 这样的等宽字体中,i 和 j 看起来非常相似。 如果你能为它们取一个短而相关的名称,你在发布之前就能找到这个问题 :) 祝你的项目/家庭作业好运。 - dooburt

3

你已经完成:

for(int j = 0; j < 8; i++)

最有可能的意思是:

for(int j = 0; j < 8; j++)

(你执行的是i++,而不是j++。)

1
在这行更改 i 为 j for (int j = 0; j < 8; i++)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接