Search code examples
multidimensional-arrayd

D lang appending to multidimensional dynamic array


I want to append a 2D array to my 3D array. I expect it should be same as int[] arr; arr ~= 3;

void readInput()
{
    char[][][] candidate;
    char[] buff;
    size_t counter = 0;
    while (  stdin.readln(buff) )
    {
        char[][] line = buff.chomp().split();
        writeln(line);

        candidate ~= line; 
        writeln(candidate);
        if (++counter > 1 ) break; 
    }
}

And I send the inputs below

201212?4 64
20121235 93

I expect a output like

[["201212?4", "64"], ["20121235", "93"]]

But instead I see

[["20121235", "93"], ["20121235", "93"]]

=~ replaces all the elements in the array with the last added. Where am I doing wrong? How can I meet my expectation?


Solution

  • The problem here is that byLine is reusing buf (that's actually one reason why it asks for a mutable buffer and returns mutable - as a warning that it might change on you).

    So when you ~= it, it is really appending the one array multiple times all with a pointer to the same data, so when it changes, that change is seen each time.

    You can fix it by adding a .dup to the array you are appending.