Why does multidimensional arrays not allocate properly?
Nicholas Wilson via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sun Jan 22 01:43:46 PST 2017
On Sunday, 22 January 2017 at 08:18:35 UTC, Jot wrote:
> On Sunday, 22 January 2017 at 08:07:26 UTC, rikki cattermole
> wrote:
>> On 22/01/2017 9:05 PM, Jot wrote:
>>> auto x = new int[][](n,m);
>>>
>>> But one cannot freely assign anywhere in x:
>>>
>>> x[3,6] = 4 crashes.
>>>
>>> I, can, of course, convert everything to a linear matrix and
>>> index by
>>> i+w*j, but what's the point of having multidimensional
>>> matrices in D if
>>> they don't allocate them fully?
>>
If you want multidimensional array (matrices, tensors) use either
std.experimental.ndslice or mir.ndslice (they are (effectively)
the
same package, one is a dev version of the other).
see https://github.com/libmir/
>> It does allocate them fully, you're indexing them wrong.
>>
>> void main() {
>> auto x = new int[][](1, 2);
>> x[0][1] = 3;
>> }
>
> No, that isn't the reason, it was cause I was going past the
> end when I added some new code(the [3,6] was suppose to be
> [3][6]).
>
> I tried it before and it was crashing before I added the new
> code and visualD seems to not be updating variable values
> properly anymore so I can't really debug ;/
>
>
> In anycase, what is the correct notation for indexing?
>
> x = new int[][](width, height)
>
> and x[height][width] or x[width][height]?
The trick is to remember that in D int[][] is effectively
(int[])[].
As such indexing the outer dimension gives you the inner
dimension.
so x[height-1][width-1] will give you the "last" element.
visually if - is an int
[ - - - - - - - - -]
[ - - - - 9 - - - -]
[ - - - - - - - - -]
the first index (i.e index it once and it) gives you the row,
index it again to get the value.
so that 9 is
x[1][4]
More information about the Digitalmars-d-learn
mailing list