On Tuesday, 19 January 2016 at 19:14:30 UTC, alb wrote:
So guys: Ali, Mike Parker and tsbockman thanks for all your explanation, in fact looking now I and after making some tests I really got it.

So:
   int[2]    a1; // Array of 2 elements of type int

int[2][5] a2; // Array of 2 elements of type int divided in 5 rows

   writeln(a2[0]); // = accessing row 0 = [0,0]
   writeln(a2[4]); // = accessing row 4 = [0,0]

One other thing you may want to keep in mind when working on this kind of thing - when you loop over a multi-dimensional array, the order matters.

For large arrays, this:

    int[c_max][r_max] arr;

    foreach(r; 0 .. r_max)
    {
        foreach(c; 0 .. c_max)
        {
            // do something with arr[r][c] here
        }
    }

Can be *much* faster than this:

    int[c_max][r_max] arr;

    foreach(c; 0 .. c_max)
    {
        foreach(r; 0 .. r_max)
        {
            // do something with arr[r][c] here
        }
    }

The reason is that the first version access the elements in the order that they are actually stored in memory, whereas the second forces the CPU to jump between rows for each element.

If that in mind, now it all makes sense for me, and of course it's consistent as well. Sorry to bother about this, but I think this will help other newcomers.

Thanks again for help/tips which helped turn my mindset.

Albert.

You're welcome.

And yes, it can definitely be confusing. I understand why the array syntax in D is the way it is, but that still doesn't always save me from mixing things up once in a while anyway.

Reply via email to