更新的问题;原文如下。
我正在尝试创建一个表示单元格网格的数组,这些单元格包含包含它们所围绕的墙壁的元组。 我想出了这个:
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不是数组,但未定义。但是,我无法弄清楚为什么。 附带问题,是否有更容易/更清洁/更好的方法来做到这一点?
答案 0 :(得分:1)
你是(在递归的第二次调用中)尝试
In_Array = array:get(array:size(Array), Array),
由于array
为零索引,因此总是会失败,因为访问将始终为1。将此行更改为
In_Array = array:get(array:size(Array) - 1, Array),
你没事。
关于您的代码的一些评论:
InArray
)x
和y
中的一维索引重新计算为index = y * max_x + x
。