Re: Overfflow in Assert error messages

2020-02-13 Thread Anonymouse via Digitalmars-d-learn

On Thursday, 13 February 2020 at 07:49:13 UTC, Adnan wrote:

However my test fails saying something like:
source/binary_search.d(33): [unittest] 18446744073709551615 != 1
core.exception.AssertError@source/binary_search.d(33): 
18446744073709551615 != 1


What's causing this underflow?


It's ulong -1, which is the type idx is of on 64-bit systems. On 
32-bit systems it will be uint -1 and say "4294967295 != 0". 
indexOf is probably not doing what you think it's doing.


int indexOf(T)(const T[] list, const T key) {
return -1;
}

void main()
{
int[] arr = [ 0 ];
foreach (idx, i; arr)
assert(indexOf(arr, i) == idx);  // 18446744073709551615 
!= 0

}


Overfflow in Assert error messages

2020-02-12 Thread Adnan via Digitalmars-d-learn

I am debugging my simple binary search (I still am):

module binary_search;

debug {
static import std;
}

int indexOf(T)(const T[] list, const T key) {
ulong lo = 0;
ulong hi = list.length - 1;
while (hi > lo) {
const ulong mid = lo + (hi - lo) / 2;
if (list[mid] > key)
hi = mid - 1;
else if (list[mid] < key)
lo = mid + 1;
else {
std.writeln("Returning ", mid, ""); // says 
its returning 0

return cast(int) mid;
}
}
return -1;
}

unittest {
scope (success)
std.writeln("binary_search.indexOf -- ok");

int[] arr;
foreach (i; 0 .. 101)
arr ~= i;
assert(arr.length > 1);
foreach (idx, i; arr)
assert(indexOf(arr, i) == idx);
}


However my test fails saying something like:
source/binary_search.d(33): [unittest] 18446744073709551615 != 1
core.exception.AssertError@source/binary_search.d(33): 
18446744073709551615 != 1


What's causing this underflow?

I am using "dflags": ["-checkaction=context"] in my dub 
configuration file.