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.

Reply via email to