When trying to set a value in a 2D array like this:
let a = Array.make 5 (Array.make 5 0);;
a.(0).(0) <- 4;
It will for some reason put 4
at index j
in every array contained in the 2D array a
.
Why is this, and how do i get it to only set a[i][j]
to 4
?
CodePudding user response:
The problem is with how you initialize the matrix. You're creating one inner array that is then assigned to every cell of the outer array instead of creating a new array for each cell. What you're doing is equivalent to this:
let inner = Array.make 5 0 in
let outer = Array.make 5 inner in
inner.(0) <- 4
You could use Array.init
to create the outer array instead, which behaves exactly like Array.make
except it takes an initialization function instead of the value to insert directly:
Array.init 5 (fun _ -> Array.make 5 0)
But even more convenient for creating a 2-dimensional array is Array.make_matrix
:
Array.make_matrix 5 5 0;;
CodePudding user response:
As an addendum to glennsl's answer, you will see this issue anytime you store a mutable value in an array.
Consider:
let arr =
let x = ref 5 in
Array.make 5 x
If we assign a new value to that int ref
value with arr.(1) := 7
or arr.(0).contents <- 7,
arr` is now:
[|{contents = 7}; {contents = 7}; {contents = 7};
{contents = 7}; {contents = 7}|]
The same does not apply if we fill our array with immutable data.
let arr =
let x = 5 in
Array.make 5 x
Now if we update with arr.(0) <- 7
, arr
is:
[|7; 5; 5; 5; 5|]