如下这段代码是我在程序里写的一个函数,之前的程序运行都是正确的,然后写了这个函数,在之前程序里调用这个函数,老是在 “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)
{
}
}
}
}
}
{
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)
{
}
}
}
}
}
不是所有的块 都让你单步执行的。
判断之前加上Console.WriteLine("resultUVWholeIndex "+resultUVWholeIndex.ToString());
Console.WriteLine("j1 "+ji.ToString());
Console.WriteLine("k1 "+k1.ToString());看出错时3个值分别是多少就知道是否有超出索引了啊
请问在Windows界面程序里,如何看到控制台的输出。
try
{
}
catch
{
}
把代码包住,保证不会出错
直接递增去模,直接跳过了判定这个不太好控制的方式(m++ 配合if(m=xxx)这个东西麻烦,主观判定上容易出错)
我将你的循环的条件的数值改小点得出resultUVWholeIndex最大的时候为CallDLL.width * CallDLL.height-1,那你arrayAOI数组的长度只有不小于CallDLL.width * CallDLL.height就可以了
你再看看graphicDefAOIArray这个二维数组你是怎么定义的,另外将getResultUVWholeCoordinateAndDisplament方法中所有的代码全部都掉,只留下
Console.WriteLine("i1 "+i1.ToString());
Console.WriteLine("resultUVWholeIndex "+resultUVWholeIndex.ToString());
观察i1,resultUVWholeIndex的值最大值就可以知道数组是否会超出索引了
resultUVWholeCoornidateAndDisplamentRow[0, 3] = resultUVWhole[CallDLL.width * CallDLL.height - CallDLL.width + 2 * m1++ - k1 + CallDLL.width *CallDLL.height]; //V方向当满足if条件的时候,对m1又加了一次,但k1并没有同步加,下次判断的时候,导致计算出的索引越界,其实希望if里的m1和判断时候的m1是一样的,唉,真是个低级错误。
真是要谢谢你们!