question about passing associative array to a function

John Colvin via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun May 11 10:00:13 PDT 2014


On Sunday, 11 May 2014 at 16:54:18 UTC, Ali Çehreli wrote:
> On 05/11/2014 07:46 AM, rbutler wrote:
>
> > I have searched and can not understand something about
> passing AAs to a
> > function.
> > I have reduced the gist of the question to a tiny program
> below.
> > If I put "ref"  in the function stmt it works, i.e.:
> >          ref int[int] aa
> > My confusion is that AAs are supposed to be passed as refs
> anyway, so I do
> > not understand why I should have to use ref to make it work.
> >
> > Related, it also works if I UN-comment the line    d[9] = 9;
> >
> > Thanks for any helpful comments you can make.
> > --rbutler
> >
> > import std.stdio;
> >
> > void test(int[int] aa, int x) {
> >      aa[x] = x;
> >      aa[8] = 8;
> > }
> >
> > void main() {
> >      int[int] d;
> >      writeln(d.length);
> >      // d[9] = 9;
> >      test(d, 0);
> >      writeln(d);
> > }
>
> The problem is with the initial state of associative arrays, 
> which happens to be null. When AAs are copied when null, both 
> copies are null, not being associated with anything, not even 
> an initial table to store the hash buckets in. As a result, 
> null AAs cannot be references to each other's (non existent) 
> data.
>
> When a null AA starts receiving data, it first creates its own 
> data memory but the other one cannot know about that data.
>
> ref parameter works because then there is only one AA to speak 
> of.
>
> d[9] entry works as well because then the first AA is not null.
>
> Ali

Remind me again why we can't just change this to a sensible 
initial state? Or at least add a .initialize()?


More information about the Digitalmars-d-learn mailing list