user2117418
user2117418

Reputation: 23

Array is filled with undefined values (Erlang)

Updated Question; Original below.

I am trying to create an array which represents a grid of cells, which have tuples containing the walls they are surrounded by. I have come up with this:

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.

When I run this with rooms(array:new()). I get the following array back:

{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}}

Which is quite close to the desired result, but there are two things I can't quite put my finger on (The numbers are correct). Why does it look like it is split up into multiple subarrays? What are those undefineds and 10's doing there? These are mostly due to my lack of erlang knowledge, because array:get produces the expected results, but I couldn't find anything which explains where they come from.


Original Question

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.

I call it with rooms(array:new()). but the result is

** 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)

Which makes sense because In_Array is not an array, but undefined. However, I can't figure out why. Side question, is there an easier/cleaner/better way to do this?

Upvotes: 0

Views: 236

Answers (1)

filmor
filmor

Reputation: 32258

You are (in the second call of the recursion) trying

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

As array is zero-indexed this will always fail, as the access will be always be off by one. Change this line to

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

and you are fine.

A few comments on your code:

  • Conventional variable naming in Erlang would be CamelCase without underscores (i.e. InArray)
  • Expressing a 2-dimensional array as nested arrays is almost never a good idea. Linearalise it by writing simple wrappers that recalculate a one-dimensional index from x and y as index = y * max_x + x.

Upvotes: 1

Related Questions