2D数组,索引超出范围C#

时间:2017-03-12 15:39:43

标签: c# labview

对于学校,我们必须在LabVIEW中制作一个盒式过滤器。我没有使用LabVIEW,而是选择在LabVIEW中使用.Net创建DLL。我已经这样做了,结果是一个IndexOutOfRange例程。

我的LabVIEW:

enter image description here

我的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中运行代码,但代码不是很好:

enter image description here

在我得到的帮助中,我们可以得出结论,问题发生在:

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 的边界。

1 个答案:

答案 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实例化时,似乎正在发生。

不幸的是,我无法帮助您解决这个问题,因为我没有清楚地了解您要完成的任务。但是,现在您知道问题可能存在的位置。