Rectangular or 2d associative arrays

Frits van Bommel fvbommel at REMwOVExCAPSs.nl
Fri Mar 16 10:47:44 PDT 2007


David Freitas wrote:
> Hello All!
> 
> Look at this small program and look at the output in the comments:
> ///////////////////////////////////
>  import std.stdio;
>  void main() 
>  {
>          int[char] x;         // Visually: = ['a':1, 'b':2] // associative array
>          x['b'] = 123;
>          writefln(x);  // this prints out: [b:2063597568]
>          writefln(x['b']); // this prints out: 123
>  }
> /////////////////////////////////
> 
> This just doesn't seem intuitive to me? Why is there a "garbage" value being printed out? 
> 
> Using a linux machine, with dmd 1.009.

Looks like it's (the value that gets inserted) << 24, or in other words 
the lower byte is put in the high byte, and the others are cleared.
It looks like it's dependent on the key size: if the key type is changed 
to ushort the upper two bytes are filled with what should be the lower 
two bytes, and if it's a three-byte struct (with toString) the upper 
three bytes should be the lower three bytes and the lower byte seems to 
be garbage.

This bug doesn't seem to affect GDC.
It looks like gphobos' std.format.doFormat.formatArg.putAArray was 
patched to make sure access to AA internals is performed on the correct 
alignment boundary. This may have been done for portability reasons, but 
I'm guessing it also fixes this bug.
Would anyone mind confirming this and submitting a bug + patch to bugzilla?


More information about the Digitalmars-d-learn mailing list