How to pass in reference a fixed array in parameter
Eric P626
ericp at lariennalibrary.com
Wed Jun 5 06:22:34 UTC 2024
On Tuesday, 4 June 2024 at 16:19:39 UTC, Andy Valencia wrote:
> On Tuesday, 4 June 2024 at 12:22:23 UTC, Eric P626 wrote:
>
>> I tried to find a solution on the internet, but could not find
>> anything, I stumble a lot on threads about Go or Rust language
>> even if I specify "d language" in my search.
>
> Aside from the excellent answer already present, I wanted to
> mention that searching with "dlang" has helped target my
> searches.
>
> Welcome to D! (From another newbie.)
> Andy
Thanks for the comments. So far, I only managed to make it work
by creating a dynamic array and keeping the same signature:
~~~
void main()
{ s_cell [][] maze = new s_cell[][](5,5);
print_maze (maze);
}
void print_maze ( s_cell [][] maze )
{
}
~~~
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;
~~~
How come the assignment does not work when passing a parameter. I
tried the following and it failed:
~~~
s_cell [5][5] maze;
s_cell [][] sliced_maze = maze;
~~~
with this message:
~~~
Error: cannot implicitly convert expression `maze` of type
`s_cell[5][5]` to `s_cell[][]`
~~~
Is it because it's a 2D array (slice of slice)? I need to
manually copy each slice manually, or use a utility function to
do the copy? This is why it cannot auto-magically do it with just
when passing a parameter.
I tried the following signatures with the ref keyword and it did
not change anything:
~~~
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.
-------------------------------------------------------
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);
void create_maze ( s_cell *maze)
{
}
~~~
I get the following error
~~~
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`
~~~
But I get the idea of ambiguity, is the pointer pointing on a
single cell, or an array of cells, so there might need a way to
specify that it's not just an elements. I tried this:
~~~
s_cell [5][5] maze;
create_maze(&maze);
void create_maze ( s_cell [][]*maze)
{
}
~~~
and get this error
~~~
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`
~~~
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
~~~
Do you have a code sample on how to pass a 2D array by pointer?
So far, the pointer solution seems like the only method that
should be compatible with both fixed and dynamic arrays unless I
am mistaken.
More information about the Digitalmars-d-learn
mailing list