如何将数组数组传递给C#中的函数?

时间:2017-06-18 07:06:54

标签: c# arrays multidimensional-array unsafe

注意,这个问题具体是关于“数组数组”,不是多维数组,不是锯齿状数组,而是固定大小的方阵。在C ++中,这将是一个“普通的旧数组”,但这个问题不是关于互操作,只是普通的C#给出了“堆栈溢出”,表明传递的数组最终在接收函数中为空。

构造一个普通数组似乎工作正常:

int[] list1 = new int[4] { 1, 2, 3, 4};
int[] list2 = new int[4] { 5, 6, 7, 8};
int[] list3 = new int[4] { 1, 3, 2, 1 };
int[] list4 = new int[4] { 5, 4, 3, 2 };
int[][] lists = new int[][] {
    list1, list2, list3, list4
};

调用有问题的函数似乎都是安全的,正常的C#代码:

Solution solution();
Console.WriteLine(a.solution(lists));

现在,当然,数据的大小不包含在信息中。这正是问题所在。但是这个C#的哪个部分“不安全”?我们没有关键字吗?

函数签名int int[][] f(),在单独的类中:

public int solution(int[][] A){
  // 1) try to access A using A.Length, which doesn't turn out to have the right information
  // 2) get a segfault
  // 3) cry
  return A.Length;
}

问题是: “如何将数组数组传递给C#函数,以便Solution.solution的签名不需要更改?”

我也很困惑我的代码,它绝对检查A.Length和A [0]。输入的长度,仍然是段错误。我原以为没有明确标记为“不安全”的C#代码因此是“安全的”。但我认为“安全”并不意味着以上述方式传递的数组实际上会到达被调用的函数。

最终目标是能够在本地进行Codility测试,无论我想要多少个测试用例。

注意:完整的源代码,只有两个小文件,带有一些不相关的代码(在Solution类中),但有一个Makefile和你需要的一切,就在这里:https://github.com/TamaHobbit/ActualSolution/blob/master/test_framework.cs

错误消息的全文:

Stack overflow: IP: 0x41ed8564, fault addr: 0x7ffc3c548fe0
Stacktrace:
  at Solution.DFS (int,int,int) [0x00040] in <6d4ef1577c8c4e11a148ddbe545112a9>:0
  <...>
  at Solution.solution (int[][]) [0x00022] in <6d4ef1577c8c4e11a148ddbe545112a9>:0
  at TestFramework.Main () [0x00068] in <6d4ef1577c8c4e11a148ddbe545112a9>:0
  at (wrapper runtime-invoke) object.runtime_invoke_void (object,intptr,intptr,intptr) [0x0004c] in <a07d6bf484a54da2861691df910339b1>:0

1 个答案:

答案 0 :(得分:1)

你有一个数组数组。因此,在索引0,1,2和3处,您有一个包含4个项目的数组。具体来说,你有一个4阵列的数组。以下是如何获得它们的大小:

public static void Main()
{
    int[] list1 = new int[4] { 1, 2, 3, 4 };
    int[] list2 = new int[4] { 5, 6, 7, 8 };
    int[] list3 = new int[4] { 1, 3, 2, 1 };
    int[] list4 = new int[4] { 5, 4, 3, 2 };
    int[][] lists = new int[][] { list1, list2, list3, list4 };
    var size = GetSize(lists);

}

public static int GetSize(int[][] items)
{
    var arrAt0 = items[0].Length;
    var arrAt1 = items[1].Length;
    // Etc...

    return items.Length;
}

要从数组中获取项目,您将这样做:

var lastItemInArray1 = lists[0][3];