bearophile wrote:

... 
> 
> The second problem is that compile-time functions are nicer, so I'd like to 
> not use templates when possible. But the following code doesn't work at 
> compile time, can you tell me why? (I have had to use a 
not nice temporary struct to return the static array)
> 
> struct S(int N) { int[N] a; }
> 
> S!(N) genSquares(int N)() {
>     S!(N) s;
>     for (int i = 0; i < N; i++) {
>         int n = i;
>         int m = 0;
>         while (n) {
>             int digit = n % 10;
>             n /= 10;
>             m += digit * digit;
>         }
>         s.a[i] = m;
>     }
> 
>     return s;
> }
> void main() {
>     const int CHUNK = 1000;
>     static const auto squares = genSquares!(CHUNK)().a;
> }
> 
> Bye and thank you,
> bearophile

I'm not sure why, this code does work:

int[] genSquares(int N)()
{
    int[] a;
    
    for (int i = 0; i < N; i++)
    {
        int n = i;
        int m = 0;

        while (n)
        {
            int digit = n % 10;
            n /= 10;
            m += digit * digit;
        }
        a~=m;
    }
    return a;
}

void main() {
    enum int CHUNK = 1000;
    enum int[CHUNK] squares = genSquares!(CHUNK)();
}

However, it fails as soon as I try do use indexing or set the length of an 
array. I thought these operations were supposed to be legal, perhaps it is a 
bug.


Reply via email to