Thread overview
Bug in the array set operator
Jun 23, 2006
roumen
Jun 23, 2006
Chris Miller
Jun 24, 2006
Sjoerd van Leent
Jun 24, 2006
Tom S
Jun 24, 2006
Ameer Armaly
June 23, 2006
I'm fairly certain that the code below should not work, but it compiles and works OK. And if I use the "correct" statement a[0..a.length-1] = 0; it does not set the last element.

import std.stdio;
private int[5] a = [1, 2, 3, 4, 5];
void main(char[][] arg)
{
foreach (int n; a)
writef("%d ", n);
writefln();

a[0..a.length] = 0;   // BUG: should be a.length-1

foreach (int n; a)
writef("%d ", n);
writefln();
}


June 23, 2006
On Thu, 22 Jun 2006 21:39:40 -0400, roumen <roumen_member@pathlink.com> wrote:

> I'm fairly certain that the code below should not work, but it compiles and
> works OK. And if I use the "correct" statement a[0..a.length-1] = 0; it does not
> set the last element.
>
> import std.stdio;
> private int[5] a = [1, 2, 3, 4, 5];
> void main(char[][] arg)
> {
> foreach (int n; a)
> writef("%d ", n);
> writefln();
>
> a[0..a.length] = 0;   // BUG: should be a.length-1
>
> foreach (int n; a)
> writef("%d ", n);
> writefln();
> }
>
>

It's [inclusive..exclusive], so [0..length] is the whole array and [0..0] is empty.
June 24, 2006
roumen schreef:
> I'm fairly certain that the code below should not work, but it compiles and
> works OK. And if I use the "correct" statement a[0..a.length-1] = 0; it does not
> set the last element.
> 
> import std.stdio;
> private int[5] a = [1, 2, 3, 4, 5];
> void main(char[][] arg)
> {
> foreach (int n; a)
> writef("%d ", n);
> writefln();
> 
> a[0..a.length] = 0;   // BUG: should be a.length-1
> 
> foreach (int n; a)
> writef("%d ", n);
> writefln();
> }
> 
> 

It's the correct behaviour. You have to see this as the mathematical expression: [a .. b)

In D, you can shorten your array statement as:

a[0..$] = 0;

Regards,
Sjoerd
June 24, 2006
Sjoerd van Leent wrote:
> In D, you can shorten your array statement as:
> 
> a[0..$] = 0;

or just:

a[] = 0;


-- 
Tomasz Stachowiak  /+ a.k.a. h3r3tic +/
June 24, 2006
"Sjoerd van Leent" <svanleent@gmail.com> wrote in message news:e7jt2l$175u$1@digitaldaemon.com...
> roumen schreef:
>> I'm fairly certain that the code below should not work, but it compiles
>> and
>> works OK. And if I use the "correct" statement a[0..a.length-1] = 0; it
>> does not
>> set the last element.
>>
>> import std.stdio;
>> private int[5] a = [1, 2, 3, 4, 5];
>> void main(char[][] arg)
>> {
>> foreach (int n; a)
>> writef("%d ", n);
>> writefln();
>>
>> a[0..a.length] = 0;   // BUG: should be a.length-1
>>
>> foreach (int n; a)
>> writef("%d ", n);
>> writefln();
>> }
>>
>>
>
> It's the correct behaviour. You have to see this as the mathematical expression: [a .. b)
>
In short, saying [a..$] means "go up to but not including $," which means all elements.  A bit confusing at first, but useful.
> In D, you can shorten your array statement as:
>
> a[0..$] = 0;
>
> Regards,
> Sjoerd