对于学校,我们必须在LabVIEW中制作一个盒式过滤器。我没有使用LabVIEW,而是选择在LabVIEW中使用.Net创建DLL。我已经这样做了,结果是一个IndexOutOfRange例程。
我的LabVIEW:
我的C#课程:
public class Filtor
{
public Int16[,] OrImage { private set; get; }
public Int16[,] NewImage { private set; get; }
public int[,] Kernel { private set; get; }
public int Row { private set; get; }
public int Column { private set; get; }
public int RowK { private set; get; }
public int ColumnK { private set; get; }
public int N { private set; get; }
private int Offset;
public Filtor()
{
OrImage = new Int16[0, 0];
NewImage = OrImage;
Kernel = new int[0, 0];
Row = 0;
Column = 0;
RowK = 0;
ColumnK = 0;
switch (RowK * ColumnK)
{
case 9:
Offset = 1;
break;
case 25:
Offset = 2;
break;
case 49:
Offset = 3;
break;
case 81:
Offset = 4;
break;
default:
Offset = 0;
break;
}
}
public Filtor(Int16[,] A, int[,] B)
{
OrImage = A;
Kernel = B;
NewImage = OrImage;
Row = A.GetLength(0);
Column = A.GetLength(1);
RowK = B.GetLength(0);
ColumnK = B.GetLength(1);
switch (RowK * ColumnK)
{
case 9:
Offset = 1;
break;
case 25:
Offset = 2;
break;
case 49:
Offset = 3;
break;
case 81:
Offset = 4;
break;
default:
Offset = 0;
break;
}
}
public void kernelFiltor(int n)
{
N = (n > 0) ? n : 1;
int i, j, k, l, M = 0;
for (i = Offset; i < (Row - Offset); i++)
{
for (j = Offset; j < (Column - Offset); j++)
{
for (k = 0; k < RowK; k++)
{
for (l = 0; l < ColumnK; l++)
{
M = M + OrImage[(i + k), (j + l)] * Kernel[k, l];
}
}
if (((1 / N) * (M / (RowK * ColumnK))) <= 0)
{
NewImage[i, j] = 0;
}
else if(((1 / N) * (M / (RowK * ColumnK))) >= 255)
{
NewImage[i, j] = 255;
}
else
{
NewImage[i, j] =Convert.ToInt16((1 / N) * (M / (RowK * ColumnK)));
}
M = 0;
}
}
}
}
有人,任何人都可以指出错误是什么?
这可能是一个错误,LabVIEW到C#或其他方面的问题。
小更新:
我在LabVIEW中运行代码,但代码不是很好:
在我得到的帮助中,我们可以得出结论,问题发生在:
for (k = 0; k < RowK; k++)
{
for (l = 0; l < ColumnK; l++)
{
M = M + OrImage[(i + k), (j + l)] * Kernel[k, l];
}
}
当第一个2D数组位于 END 时,第二个2D数组移出边界,导致IndexOutOfRange异常。如何锁定第二个数组 B ,退出第一个数组 A 的边界。
答案 0 :(得分:1)
使用您在上面定义的类并使用以下代码调用它:
var A = new Int16[1, 1];
A[0, 0] = Int16.MaxValue;
var B = new Int32[2, 1];
B[0, 0] = Int32.MaxValue;
B[1, 0] = Int32.MaxValue;
var f = new Filtor(A, B);
f.kernelFiltor(123);
您将能够看到代码在您班级的以下行中断:
for (k = 0; k < RowK; k++)
{
for (l = 0; l < ColomK; l++)
{
M = M + OrImage[(i + k), (j + l)] * Kernel[k, l];
}
}
更准确地说,以下声明:
OrImage[(i + k), (j + l)]
当Filtor
类使用B
的较长数组而不是A
实例化时,似乎正在发生。
不幸的是,我无法帮助您解决这个问题,因为我没有清楚地了解您要完成的任务。但是,现在您知道问题可能存在的位置。