On 09/20/2011 12:50 AM, Adam Burton wrote:
Simen Kjaeraas wrote:
On Mon, 19 Sep 2011 23:20:47 +0200, bearophile<[email protected]>
wrote:
A tiny puzzle I've shown on IRC. This is supposed to create an inverted
array of cards, but what does it print instead?
import std.stdio, std.algorithm, std.range;
void main() {
int[52] cards;
copy(iota(cards.length - 1, -1, -1), cards[]);
writeln(cards);
}
Gawds, that's an ugly bug. For those who can't spot it,
typeof(cards.length) == uint, hence -1 is converted to a uint
(4_294_967_295, to be exact). iota then says 'that's fine, I'll just
return an empty range for you.'
Solution: knock some sense into integral promotion rules.
Workaround: cast(int)cards.length.
What was the rationale for having unsigned array lengths, again?
That's not what happened for me. It failed to compile for me due to
ElementType of Range1 not matching Range2 ElementType. Could this be due to
using 64bit (size_t is ulong)?
If you recompile with the -m32 switch it should be accepted.