数组中填充了未定义的值(Erlang)

时间:2014-11-29 19:36:22

标签: arrays erlang

更新的问题;原文如下。

我正在尝试创建一个表示单元格网格的数组,这些单元格包含包含它们所围绕的墙壁的元组。 我想出了这个:

rooms(Array) ->
  Size = array:size(Array),
  if       
    Size == ?HSIZE * ?VSIZE ->
      Array;
    true ->
      HFactor = Size rem ?VSIZE,
      VFactor = Size div ?HSIZE,
      Room = {1+HFactor+11*VFactor,
              7+HFactor+11*VFactor,
              12+HFactor+11*VFactor,
              6+HFactor+11*VFactor},
      rooms(array:set(Size, Room, Array))
  end.

当我使用rooms(array:new()).运行时,我得到以下数组:

{array,25,100,undefined,
   {{{1,7,12,6},
     {2,8,13,7},
     {3,9,14,8},
     {4,10,15,9},
     {5,11,16,10},
     {12,18,23,17},
     {13,19,24,18},
     {14,20,25,19},
     {15,21,26,20},
     {16,22,27,21}},
    {{23,29,34,28},
     {24,30,35,29},
     {25,31,36,30},
     {26,32,37,31},
     {27,33,38,32},
     {34,40,45,39},
     {35,41,46,40},
     {36,42,47,41},
     {37,43,48,42},
     {38,44,49,43}},
    {{45,51,56,50},
     {46,52,57,51},
     {47,53,58,52},
     {48,54,59,53},
     {49,55,60,54},
     undefined,undefined,undefined,undefined,undefined},
    10,10,10,10,10,10,10,10}}

这与期望的结果非常接近,但有两件事我不能完全指责(数字是正确的)。为什么它看起来像被分成多个子阵列?那些未定义的和10个在那里做什么?这些主要是由于我缺乏erlang知识,因为array:get产生了预期的结果,但我找不到任何解释它们来自哪里的东西。


原始问题

rooms(Array) ->
  Size = array:size(Array),
  if 
    Size == 5 ->
      Array;
    Size rem 5 == 0 ->
      rooms(array:set(Size, array:new(), Array));
    true -> 
      In_Array = array:get(array:size(Array), Array),
      In_Size = array:size(In_Array),
      Room = {1+In_Size+11*In_Size,
              7+In_Size+11*In_Size,
              12+In_Size+11*In_Size,
              6+In_Size+11*In_Size},
      New_In = array:set(In_Size, Room, In_Array),
      rooms(array:set(Size, New_In, Array))
  end.

我用rooms(array:new()).调用它,但结果是

** exception error: bad argument
 in function  array:size/1 (array.erl, line 317)
 in call from framework_kamer:rooms/1 (framework_kamer.erl, line 195)

这是有道理的,因为In_Array不是数组,但未定义。但是,我无法弄清楚为什么。 附带问题,是否有更容易/更清洁/更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

你是(在递归的第二次调用中)尝试

In_Array = array:get(array:size(Array), Array),

由于array为零索引,因此总是会失败,因为访问将始终为1。将此行更改为

In_Array = array:get(array:size(Array) - 1, Array),

你没事。

关于您的代码的一些评论:

  • Erlang中的常规变量命名是没有下划线的CamelCase(即InArray
  • 将二维数组表示为嵌套数组几乎不是一个好主意。通过编写简单包装来对其进行线性化,这些包装器将xy中的一维索引重新计算为index = y * max_x + x