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.