On Friday, 28 June 2013 at 17:07:22 UTC, Ali Çehreli wrote:
On 06/28/2013 07:00 AM, snow wrote:> Hello there,
> Ive got the following code
>
> http://dpaste.dzfl.pl/e391a268
>
> This code throws me a "Range Exception" in Algorithm.d.
>
> If I use a lower number of random vectors, like 100, the code
> terminates. Also, if I delete the template instruction like
this :
>
> sort(individuals);
>
> I also don't get an exception.

Yes, what is thrown is an Error. (Error and Exception are different hierarchies under Throwable.)

> Does anybody know, why this is the case?

Your opCmp does not provide a complete ordering of objects:

        int opCmp(ref const Vector3D vec) {
                if (this.x > vec.x && this.y > vec.y && this.z > vec.z)
                        return 1;
                
                if (this.x < vec.x && this.y < vec.y && this.z < vec.z)
                        return -1;
                
                return 0;
        }

According to that function, the following two values are neither less than nor greater than the other:

    // passes:
    assert(!(Vector3D(1, 2, 3) < Vector3D(2, 1, 3)) &&
           !(Vector3D(1, 2, 3) > Vector3D(2, 1, 3)));

Ali

I tried this now:
        int opCmp(ref const Vector3D vec) {
                if (this.x > vec.x && this.y > vec.y && this.z > vec.z)
                        return 1;
                return -1;
        }
this should be a total ordering, because a Vector is always greater or smaller, than another, but I still get the same exception.

Reply via email to