TDPL dictionary example - ERROR with dmd and gdc
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Fri Dec 24 09:51:01 PST 2010
On 12/24/2010 11:35 AM, Caligo wrote:
> I've been following the examples in the book and on page 8 we have this:
>
> import std.stdio;
> import std.string;
>
> void main(){
>
> size_t[string] dictionary;
> foreach(line; stdin.byLine()){
> foreach(word; splitter(strip(line))){
> if(word in dictionary) continue;
> auto newID = dictionary.length;
> dictionary[word] = newID;
> writeln(newID, '\t', word);
> }
> }
> }
>
> With the latest GDC, which I think uses the latest 2.051, I get this error:
> dictionary.d:12: Error: associative arrays can only be assigned values
> with immutable keys, not char[]
>
> Someone told me on digitalmars-d.learn that it works with DMD, but I
> just downloaded the latest DMD that was just released and I still get
> the same error.
>
> Is there a workaround to this? and why the error?
Yah, this has been a long-standing issue. dmd has accepted for a while
the code but produced incorrect results. Since then the bug has been
fixed to refuse compilation.
The problem is, line has type char[] and the map's key type is string,
i.s. array of immutable char. To convert x to string you need to say
either x.idup or to!string(x). In theory the compiler/library would be
clever enough to do that automatically when necessary, but we decided
against it for now.
So: replace dictionary[word] with either dictionary[word.idup] or
dictionary[to!string(word)]. A future printing will correct this mistake.
Andrei
More information about the Digitalmars-d
mailing list