如下这段代码是我在程序里写的一个函数,之前的程序运行都是正确的,然后写了这个函数,在之前程序里调用这个函数,老是在 “if (CallDLL.graphicDefAOIArray[i1, j1].graphicDefAOIArray[i1, j1].arrayAOI[resultUVWholeIndex] == 1)”这句报错,说“索引越界”,然后我就单步调试看怎么会越界,CallDLL.width是常量768, CallDLL.height是484,graphicDefAOIArray[i1, j1]这个数组肯定不可能越界,个数很少就几个,arrayAOI[]有768*484个,然后我就加了这一段                    if (m1 == CallDLL.width)
                    {
                        m1 = 0;
                        n1 = (k1 + 1) / CallDLL.width;
                        if (n1 == 98)
                        {
                        }
                    } 
测试,n1随便取了一个数,比如98,直接运行不行,取97可以运行,然后再单步运行到98就可以了,试了很多组数字都是这种情况,觉得很奇怪,后来我在网上查了一下,他们说有可能是线程同步,同名变量没有锁定,于是我就把这个函数里的所有变量名改成整个程序中唯一的名字,但是还是同样的情况,而且整个程序并没有用到多线程的东西。请问一下这到底是什么问题?                private void getResultUVWholeCoordinateAndDisplament(int i1)
{
            int coornidateX = 0, CoornidateY = 0, m1 = 0, n1 = 0;
            double[,] resultUVWholeCoornidateAndDisplamentRow = new double[1, 4];            for (int j1 = 0; j1 < veriNum; j1++)
            {
                for (int k1 = 0; k1 < CallDLL.width * CallDLL.height; k1++)
                {
                   nt resultUVWholeIndex = CallDLL.width * CallDLL.height - CallDLL.width + 2 * m1++ - k1;
                    if (CallDLL.graphicDefAOIArray[i1, j1].arrayAOI[resultUVWholeIndex] == 1)
                    {
                        CoornidateY = k1 / CallDLL.width;
                        coornidateX = k1 % CallDLL.width;
                        resultUVWholeCoornidateAndDisplamentRow = new double[1, 4];
                        resultUVWholeCoornidateAndDisplamentRow[0, 0] = coornidateX;
                        resultUVWholeCoornidateAndDisplamentRow[0, 1] = CoornidateY;
                        resultUVWholeCoornidateAndDisplamentRow[0, 2] = resultUVWhole[CallDLL.width * CallDLL.height - CallDLL.width + 2 * m1++ - k1];  //U方向
                        resultUVWholeCoornidateAndDisplamentRow[0, 3] = resultUVWhole[CallDLL.width * CallDLL.height - CallDLL.width + 2 * m1++ - k1 + CallDLL.width * CallDLL.height];  //V方向
                        resultUVWholeCoornidateAndDisplament.Add(resultUVWholeCoornidateAndDisplamentRow);
                    }
                    if (m1 == CallDLL.width)
                    {
                        m1 = 0;
                        n1 = (k1 + 1) / CallDLL.width;
                        if (n1 == 98)
                        {
                        }
                    }
                }
            }
}

解决方案 »

  1.   

    hehe 帮你顶。
    不是所有的块 都让你单步执行的。
      

  2.   

    在你的if (CallDLL.graphicDefAOIArray[i1, j1].arrayAOI[resultUVWholeIndex] == 1)
    判断之前加上Console.WriteLine("resultUVWholeIndex "+resultUVWholeIndex.ToString());
    Console.WriteLine("j1 "+ji.ToString());
    Console.WriteLine("k1 "+k1.ToString());看出错时3个值分别是多少就知道是否有超出索引了啊
      

  3.   


    请问在Windows界面程序里,如何看到控制台的输出。
      

  4.   


    try
    {
    }
    catch
    {
    }
    把代码包住,保证不会出错
      

  5.   

    一加Console.WriteLine,程序运行就一直在输出resultUVWholeIndex,那是相当相当得慢,估计数组个数太多了。
      

  6.   

    没有调试,看不出来。不过就单对m1处理的方式来说,我认为 直接取模 要比 重新赋值要来的安全。
    直接递增去模,直接跳过了判定这个不太好控制的方式(m++ 配合if(m=xxx)这个东西麻烦,主观判定上容易出错)
      

  7.   

    CallDLL.graphicDefAOIArray[i1, j1].arrayAOI[resultUVWholeIndex]我相信前面这个数组不太会出错,关键是红色部分这个数组,而 resultUVWholeIndex 则根据m1,k1来计算我想应该把跟踪一下 当时的数组大小,m1,k1 等值
      

  8.   

    我也认为是resultUVWholeIndex导致的数组出错,
    我将你的循环的条件的数值改小点得出resultUVWholeIndex最大的时候为CallDLL.width * CallDLL.height-1,那你arrayAOI数组的长度只有不小于CallDLL.width * CallDLL.height就可以了
      

  9.   

    是的,resultUVWholeIndex最大的时候应该为CallDLL.width * CallDLL.height-1,而arrayAOI数组的长度确实就是CallDLL.width * CallDLL.height,这是已经定义好的。
      

  10.   

    之前没注意到你的i1是传进来的,那就可能是graphicDefAOIArray数组出的问题了.
    你再看看graphicDefAOIArray这个二维数组你是怎么定义的,另外将getResultUVWholeCoordinateAndDisplament方法中所有的代码全部都掉,只留下
    Console.WriteLine("i1 "+i1.ToString());
    Console.WriteLine("resultUVWholeIndex "+resultUVWholeIndex.ToString()); 
    观察i1,resultUVWholeIndex的值最大值就可以知道数组是否会超出索引了
      

  11.   

    问题找到啦,原因是这两句:resultUVWholeCoornidateAndDisplamentRow[0, 2] = resultUVWhole[CallDLL.width * CallDLL.height - CallDLL.width + 2 * m1++ - k1];  //U方向
    resultUVWholeCoornidateAndDisplamentRow[0, 3] = resultUVWhole[CallDLL.width * CallDLL.height - CallDLL.width + 2 * m1++ - k1 + CallDLL.width *CallDLL.height];  //V方向当满足if条件的时候,对m1又加了一次,但k1并没有同步加,下次判断的时候,导致计算出的索引越界,其实希望if里的m1和判断时候的m1是一样的,唉,真是个低级错误。
    真是要谢谢你们!