How to pass in reference a fixed array in parameter
Eric P626
ericp at lariennalibrary.com
Thu Jun 6 06:22:12 UTC 2024
On Wednesday, 5 June 2024 at 10:36:50 UTC, Nick Treleaven wrote:
> ```d
> import std.stdio;
> alias s_cell = int;
>
> void main()
> { writeln("Maze generation demo");
>
> s_cell [5][5] maze;
> int n;
> foreach (i, row; maze)
> foreach (j, col; row)
> maze[i][j] = n++;
>
> s_cell[][5] slices;
> foreach (i, _; maze)
> slices[i] = maze[i];
>
> print_maze (slices);
> }
>
> void print_maze ( s_cell [][] maze )
> {
> foreach (a; maze)
> a.writeln();
> }
> ```
Thanks for the feedback
Almost all my projects works intensively with multiple dimensions
arrays. So I want to know the best way to manage multi
dimensional arrays. I guess the best solution so far are:
1) Only use dynamic arrays.
2) Use a single dimension array, and compute the index value from
x,y,z coordinates (Makes dynamic allocation easier). This
solution could work well with pointers too.
3) Make my own data structure or class containing the array.
Allowing to pass the structure/class by reference. Could allow
encapsulating single or multi dimensional arrays.
About .ptr, the documentation page state that:
~~~
The .ptr property for static and dynamic arrays will give the
address of the first element in the array:
~~~
So I assumed that the following expressions where equivalent, but
I guess the multiple dimensions do complicate things:
~~~
array.ptr == &array == &array[0]
~~~
So ommitting the "ref" keyword it's like if the data was read
only even if the variable is not passed by value. That means that
this signature cannot modify the content of the 2D array:
~~~
void print_maze ( s_cell [][] maze )
~~~
For the create_maze() function, I would need to use the follwing
signature since it changes the content of the array.
~~~
void print_maze ( ref s_cell [][] maze )
~~~
I imagine `a.writeln();` is the same as `writeln(a);` ?
Your foreach loops look better than mine. Here is the code I have
been using to print the maze.
~~~
void print_maze ( s_cell [][] maze )
{
//print top row, assume full
foreach ( cell; maze[0] ) write("+---");
writeln("+");
for ( int y = 0; y < maze.length; y++)
{ //print content
write("|"); //assume edge is always full
for ( int x = 0; x < maze[y].length; x++)
{ write(" ");
write( maze[y][x].east ? "|": " ");
}
writeln();
foreach ( cell; maze[y] ) write( cell.south ? "+---" : "
" );
writeln("+");
}
}
~~~
your iteration version is more neat:
~~~
foreach (i, row; maze)
foreach (j, col; row)
maze[i][j] = n++;
~~~
I like that using 2 variables (i,row) or (j,col) allow to access
the variable later as a element in a collection or as an index.
It's more flexible. I'll guess I'll need to read more code to
avoid programming too much old school (^_^).
More information about the Digitalmars-d-learn
mailing list