On 07/05/2013 09:00 PM, Oleksiy wrote:

> Look like there is a consequence - can't perform array-wise operations
> on multidimensional arrays?

I don't want to accept that conclusion because there is no such thing as a multidimensional array in D. :) (To be fair, they don't exist in C and C++.)

What we call a multidimensional array is achieved by defining arrays where the elements are arrays themselves. But D does not know or care about that. As a result, array-wise operations apply only to the outermost layer of so-called multidimensional arrays.

Let's have the following two-dimensional arrays:

int[][] a;
int[][] b;
int[][] c;

We can still use the array-wise syntax:

c[] = a[] OP b[];

Let's think about what can appear as an operator instead of OP above... Since the elements of the outer layers of the array are themselves arrays (more correctly, slices), then OP must be an operator that can have two slices on its side. The concatenation operators comes to mind but I could not make it work:

c[] = a[] ~ b[];

That should have the same effect as concatenating the corresponding elements of a and b and assigning the result to c.

It does not work.

> And that's why a need to touch the elements
> themselves, like in the example you provided:
>
> import std.stdio;
>>
>> void main()
>> {
>>     dchar[3][5] arr = '.';
>>
>>     foreach (ref e; arr) {
>>         e[2] = '!';
>>     }
>>
>>     writeln(arr);
>> }

That example is doing what you needed to do: Assign a specific value to a column of the multidimensional array. Unfortunately, there is no special syntax in D to do that.

> Also huge thank you for your book - holy grail for beginners.

Thank you very much for the kind words; makes me very happy.

> --------------------------------
>> But this doesn't compile:
>>
>>     char[3][5] arr = [ '.', '.', '.' ];
>>
>> Error: mismatched array lengths, 15 and 3
>>
>> I see that as a bug but can't be sure.
>
> Others seem to agree with you, will you be submitting this bug?

As TommiT did, it is better to try a code that has a fixed-length array on the right-hand side:

void main()
{
    int[3] values = [ 1, 2, 3 ];

    int[3][2] a = values;
}

Error: mismatched array lengths, 6 and 3

Reported:

  http://d.puremagic.com/issues/show_bug.cgi?id=10562

Ali

Reply via email to