Error: non-constant expression...

spir denis.spir at gmail.com
Fri Nov 26 14:15:24 PST 2010


On Fri, 26 Nov 2010 16:17:10 -0500
bearophile <bearophileHUGS at lycos.com> wrote:

> spir:
> 
> > void f () {
> >     static string[string] map = ["1":"un", "2":"du", "3":"tri"];
> > }
> > ==>
> > Error: non-constant expression ["1":"un","2":"du","3":"tri"]
> > 
> > I do not understand what is meant, and what I should do.
> 
> Associative arrays are run-time things... well, enum associative arrays are compile-time things in theory, but there is a compiler bug here (I think an enum struct gets re-evaluated each time).
> 
> So this works, but I think it's not efficient:
> 
> void foo() {
>     enum string[string] map = ["1":"un", "2":"du", "3":"tri"];
> }
> 
> 
> > I need 'static', it's a constant value for the func.
> 
> A static variable in a function is a global value that is visible only inside that function and its sub-scopes (this is not always true in DMD, but I think these cases are bugs).
> 
> 
> > "static int[] a = [1,2,3];" is OK. Where's the difference?
> > Also tried const() and immutable(), who knows?, but no way. Search does not bring anything for "non-constant expression".
> 
> Both const and immutable work:
> 
> void foo() {
>     immutable string[string] map1 = ["1":"un", "2":"du", "3":"tri"];
>     const string[string] map2 = ["1":"un", "2":"du", "3":"tri"];
> }
> 
> But those map1 and map2 aren't static, this is not good because I think those AAs get initialized at each function call (despite only once is enough here). To avoid that you may use:
> 
> immutable string[string] fooMap;
> static this() {
>     fooMap = ["1":"un", "2":"du", "3":"tri"];
> }
> void foo() {
>     // ....
> }
> 
> But the disadvantage is that fooMap is accessible outside foo() too.
> In my mind there is some confusion about all this. Other people may give you better answers.
> 
> 
> > (Also: pointer to dmd error messages welcome.)
> 
> I don't know any complete list of DMD errors.
> 
> Bye,
> bearophile

All right, thank you Bearophile. I'll define it outside the func (not so bad in my case, as the func itself is not in global scope). And I'll have a look at your asm code tomorrow when my brain is fresher ;-)


Denis
-- -- -- -- -- -- --
vit esse estrany ☣

spir.wikidot.com



More information about the Digitalmars-d-learn mailing list