| Thread overview | ||||||
|---|---|---|---|---|---|---|
|
October 27, 2013 Nested for loop issue | ||||
|---|---|---|---|---|
| ||||
Dear All,
Greetings!
I has been an hour I starting making my hands dirty with D. I wrote following program:
import std.string;
import std.stdio;
ushort adder(ushort a, ushort b) {
return (cast(ushort)(a + b)) ;
}
unittest {
bool testStimEq(ushort a, ushort b, ushort result){
try {
writefln(" STIM :: Testing for %d and %d", a,b);
assert(adder(a,b) == result);
writefln(" STAT :: Test for %d and %d passed", a,b);
return (false) ;
} catch (core.exception.AssertError) {
writefln(" STAT :: Test for %d and %d failed", a,b);
return(true) ;
}
}
bool testStimnEq(ushort a, ushort b, ushort result){
try {
writefln(" STIM :: Testing for %d and %d", a,b);
assert(adder(a,b) != result);
writefln(" STAT :: Test for %d and %d passed", a,b);
return (false) ;
} catch (core.exception.AssertError) {
writefln(" STAT :: Test for %d and %d failed", a,b);
return(true) ;
}
}
writeln(" MESG :: Starting unit testing");
int status = 0 ;
//status += testStimEq(1,1,2);
//status += testStimnEq(1,10,3);
for (ushort i = 0 ; i < 65536 ; ++i){ // Holy King-Kong!
for (ushort j = 0 ; j < 65536 ; ++j){
status += testStimEq(i,j,cast(ushort)(i+j));
}
}
if(status == 0) writeln(" MESG :: All unit tests passed");
else writeln(" ERRN :: Unit test failed");
}
void main()
{}
I found that inner for loop is behaving correctly, but i is not changing.
What is that I am doing ? OR is it gcd ?
Regards, Sumit
| ||||
October 27, 2013 Re: Nested for loop issue | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Sumit Adhikari | On Sunday, 27 October 2013 at 09:05:06 UTC, Sumit Adhikari wrote:
> for (ushort i = 0 ; i < 65536 ; ++i){ // Holy King-Kong!
>
> for (ushort j = 0 ; j < 65536 ; ++j){
>
> status += testStimEq(i,j,cast(ushort)(i+j));
>
> }
> }
> What is that I am doing ?
You have an infinite loop nested within another infinite loop, ushort cannot represent a value which is >= 65536.
| |||
October 27, 2013 Re: Nested for loop issue | ||||
|---|---|---|---|---|
| ||||
Posted in reply to safety0ff | On Sunday, 27 October 2013 at 09:33:32 UTC, safety0ff wrote:
> On Sunday, 27 October 2013 at 09:05:06 UTC, Sumit Adhikari wrote:
>> for (ushort i = 0 ; i < 65536 ; ++i){ // Holy King-Kong!
>>
>> for (ushort j = 0 ; j < 65536 ; ++j){
>>
>> status += testStimEq(i,j,cast(ushort)(i+j));
>>
>> }
>> }
>> What is that I am doing ?
>
> You have an infinite loop nested within another infinite loop, ushort cannot represent a value which is >= 65536.
Oops, missed that i & j is 16 bit!. Thanks for pointing that out
Regards, Sumit
| |||
October 27, 2013 Re: Nested for loop issue | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Sumit Adhikari | Am Sun, 27 Oct 2013 10:40:01 +0100 schrieb "Sumit Adhikari" <sumit.adhikari@gmail.com>: > On Sunday, 27 October 2013 at 09:33:32 UTC, safety0ff wrote: > > On Sunday, 27 October 2013 at 09:05:06 UTC, Sumit Adhikari wrote: > >> for (ushort i = 0 ; i < 65536 ; ++i){ // Holy King-Kong! > >> > >> for (ushort j = 0 ; j < 65536 ; ++j){ > >> > >> status += testStimEq(i,j,cast(ushort)(i+j)); > >> > >> } > >> } > >> What is that I am doing ? > > > > You have an infinite loop nested within another infinite loop, ushort cannot represent a value which is >= 65536. > > Oops, missed that i & j is 16 bit!. Thanks for pointing that out > > Regards, Sumit The idea of using correctly sized types everywhere is honorable, but I found that for loops over N iterations better use 32-bit integers or machine word size. One issue is that you cannot iterate over all possible ushorts with a ushort, another is that the loop variables fit better into CPU registers as int/uint or size_t. So I came to think of loop variables as indexes into the list of ushorts and indexes are size_t. :) -- Marco | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply