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