Associative arrays give compile error

Denis Koroskin 2korden at gmail.com
Tue Oct 5 05:45:46 PDT 2010


On Tue, 05 Oct 2010 16:32:14 +0400, Bob Cowdery <bob at bobcowdery.plus.com>  
wrote:

>  On 05/10/2010 13:05, Denis Koroskin wrote:
>> On Tue, 05 Oct 2010 15:53:55 +0400, Denis Koroskin <2korden at gmail.com>
>> wrote:
>>
>>> On Tue, 05 Oct 2010 15:40:39 +0400, Bob Cowdery
>>> <bob at bobcowdery.plus.com> wrote:
>>>
>>>>  On 05/10/2010 12:13, Denis Koroskin wrote:
>>>>> On Tue, 05 Oct 2010 15:08:39 +0400, Bob Cowdery
>>>>> <bob at bobcowdery.plus.com> wrote:
>>>>>
>>>>>>  On 05/10/2010 12:04, Denis Koroskin wrote:
>>>>>>> On Tue, 05 Oct 2010 14:57:22 +0400, Bob Cowdery
>>>>>>> <bob at bobcowdery.plus.com> wrote:
>>>>>>>
>>>>>>>>  On 05/10/2010 11:45, Denis Koroskin wrote:
>>>>>>>>> On Tue, 05 Oct 2010 14:23:47 +0400, Bob Cowdery
>>>>>>>>> <bob at bobcowdery.plus.com> wrote:
>>>>>>>>>
>>>>>>>>>>  I can't seem to get any sense out of associative arrays. Even
>>>>>>>>>> the
>>>>>>>>>> simplest definition won't compile so I must be doing something
>>>>>>>>>> daft.
>>>>>>>>>>
>>>>>>>>>> int[string] aa = ["hello":42];
>>>>>>>>>>
>>>>>>>>>> Error: non-constant expression ["hello":42]
>>>>>>>>>>
>>>>>>>>>> What exactly is not constant about this. The example is straight
>>>>>>>>>> out the
>>>>>>>>>> book. Using D 2.0.
>>>>>>>>>>
>>>>>>>>>> bob
>>>>>>>>>
>>>>>>>>> What exactly compiler version are you using (run dmd with no
>>>>>>>>> args)?
>>>>>>>>> Works perfectly fine here (dmd2.049).
>>>>>>>>
>>>>>>>> It says 2.049. How odd. I've got a fair amount of code and
>>>>>>>> everything
>>>>>>>> else compiles fine.
>>>>>>>
>>>>>>> Can you please post complete code snippet that fails to compile?
>>>>>>>
>>>>>>> Here is the code I used to test:
>>>>>>>
>>>>>>> module aa;
>>>>>>>
>>>>>>> import std.stdio;
>>>>>>>
>>>>>>> void main()
>>>>>>> {
>>>>>>>     int[string] aa = ["hello":42];
>>>>>>>     writeln(aa["hello"]);
>>>>>>> }
>>>>>>>
>>>>>>> # dmd -run aa.d
>>>>>>
>>>>>> Ah! It's some other code below it that is not giving an error but
>>>>>> causing the error above. So the compiler is getting confused. What
>>>>>> I was
>>>>>> actually trying to do was create an associative array with a
>>>>>> string as a
>>>>>> key and a Tuple as the value. Now
>>>>>>
>>>>>> auto aa = [
>>>>>>     "some string": (100.0, 6100.0)
>>>>>> ]
>>>>>>
>>>>>> compiles but is clearly wrong and gives rise to other errors.  Does
>>>>>> anyone know the correct way to define this and then access the  
>>>>>> tuple.
>>>>>
>>>>> import std.stdio;
>>>>> import std.typecons;
>>>>>
>>>>> void main()
>>>>> {
>>>>>     auto aa = ["hello": tuple(100.0, 6100.0)];
>>>>>     auto result = aa["hello"];
>>>>>
>>>>>     writeln(result.field[0], " ", result._1); // primary and
>>>>> alternative way
>>>>> }
>>>>
>>>> Thanks. I've established that works for me and also that the actual
>>>> array I'm using also works in the test program but it won't compile in
>>>> the real program. I've commented everything else out of the file and
>>>> just left...
>>>>
>>>> import std.typecons;
>>>>
>>>> auto A_RX_FILT = [
>>>>     "6K0": tuple(100.0, 6100.0),
>>>>     "2K4": tuple(300.0, 2700.0),
>>>>     "2K1": tuple(300.0, 2400.0),
>>>>     "1K0": tuple(300.0, 1300.0),
>>>>     "500": tuple(500.0, 1000.0),
>>>>     "250": tuple(600.0, 850.0),
>>>>     "100": tuple(700.0, 800.0)
>>>> ];
>>>>
>>>
>>> You are trying to declare global variable and initialize at in
>>> compile time. As far as I know, you can't initialize AA at compile
>>> time atm (this might be implemented in future though).
>>>
>>> As such, I'd recommend against using global variables (try moving it
>>> to some class or something). Anyway, you need to initialize it at
>>> some point, either manually:
>>>
>>> Tuple!(double,double)[string] A_RX_FILT;
>>>
>>> void init()
>>> {
>>>      A_RX_FILT = [
>>>     "6K0": tuple(100.0, 6100.0),
>>>     "2K4": tuple(300.0, 2700.0),
>>>     "2K1": tuple(300.0, 2400.0),
>>>     "1K0": tuple(300.0, 1300.0),
>>>     "500": tuple(500.0, 1000.0),
>>>     "250": tuple(600.0, 850.0),
>>>     "100": tuple(700.0, 800.0)
>>>      ];
>>> }
>>>
>>> or automatically at thread startup:
>>>
>>> static this()
>>> {
>>>      init();
>>> }
>>>
>>> Hope that helps.
>>
>> See my other reply for a better solution.
>
> Thanks very much. It compiles now. The reason I thought it was an issue
> was because sometime it did compile a global associative array. I need
> to do some homework on what 'this' does. It's clearly a powerful concept
> and has wider application than class constructors.
>

"static this" is called a static constructor and can be used for classes  
and modules. The code in static constructor is guarantied to be called  
before you use that class/module, it usually happens upon thread  
initialization.

The other solution is better though:

enum A_RX_FILT = [				// just works
      "6K0": tuple(100.0, 6100.0),
      "2K4": tuple(300.0, 2700.0),
      "2K1": tuple(300.0, 2400.0),
      "1K0": tuple(300.0, 1300.0),
      "500": tuple(500.0, 1000.0),
      "250": tuple(600.0, 850.0),
      "100": tuple(700.0, 800.0)
];


More information about the Digitalmars-d-learn mailing list