On Wednesday, 5 June 2024 at 06:22:34 UTC, Eric P626 wrote:
Now according to the book, it's possible to assign a slice from
a fixed array. This code will compile:
~~~
int[12] monthDays = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,
30, 31 ];
int[] a_slice = monthDays;
~~~
The element types are both int, so the compiler can slice the
static array. As if you had written `a_slice = monthDays[];`.
How come the assignment does not work when passing a parameter.
I tried the following and it failed:
~~~
s_cell [5][5] maze;
The element type is s_cell[5].
s_cell [][] sliced_maze = maze;
The element type of sliced_maze is s_cell[], so the element types
are incompatible.
~~~
void print_maze ( ref s_cell maze )
void print_maze ( ref s_cell [][] maze )
~~~
From what I found, arrays passed in parameters are always
passed by reference. So the ref keyword seems pointless.
You don't need `ref` to be able to read the array length and
elements.
However, if you want to modify the array length, and have it
affect the caller's dynamic array, you need `ref`.
-------------------------------------------------------
The only solution left is to use pointers. But even this does
not seems to work as in C. I created a function with different
pointer signature and they all fails.
Normally in C, this would have worked:
~~~
s_cell [5][5] maze;
create_maze(&maze);
Pass `&maze[0][0]` instead.
~~~
Error: function `mprmaze.create_maze(s_cell[][]* maze)` is not
callable using argument types `(s_cell[5][5]*)`
cannot pass argument `& maze` of type `s_cell[5][5]*` to
parameter `s_cell[][]* maze`
~~~
s_cell[5][5] cannot implicitly convert to s_cell[][].
Now I think it expect a 2D array of pointers instead of a
pointer on a 2D array.
It's also not clear if there is a difference between those 2
notations:
~~~
&maze
maze.ptr
~~~
&maze is a pointer to s_cell[5][5].
maze.ptr is a pointer to s_cell[5]. `.ptr` means a pointer to the
first element of the array.