Don wrote:
bearophile wrote:
Do you see a problem here?

import std.stdio: writeln;
int[24] arr = [10,2,15,15,14,12,3,7,13,5,9,9,7,9,9,9,11,15,1,1,12,5,14];
void main() {
    writeln(arr);
}

This code compiles and runs fine, I think according to the D specs, but it can hide a bug.

(Don has split my bug report to avoid fixing the whole problem. I don't think mine is an enhancement request as Don writes, I think it's a bug in the D specs.)

I share your opinion that it's a poor design, but it's not a bug. It's explicitly supported in the spec.

The idea is that for long arrays, often only the start of it needs initialization to anything but 0.

By contrast, a literal with too many items is clearly a bug (it's an array bounds error). Especially when the compiler crashes.

Yes, and thanks for your patch to fix it!

A third case is when you really want to define a static array using a literal that has less items than the static array. I think this is an uncommon case, what are the real use cases of this? But we might want to support it anyway. Two examples:

int[4] datas = [1, 2];
int[3][3] mat = [[1,2,3], [4,5,6]];

In D there is another way to write that (using the associative array syntax! this smells bad):
int[4] datas = [0:1, 1:2];

I do not know why this syntax is supported,

It's so if you only need a few items in a large array initialized. C99 supports it as well.

but it's in the spec. Note that you can even write:
int [4] datas = [1:2, 3, 0:1];
That syntax explicitly allows members to remain uninitialized.
(BTW, it's much, much older than associative array syntax).

Reply via email to