Thread overview
Can't incremen int inside funciton call -- bug?
May 29, 2007
Aldarris
May 29, 2007
Ary Manzana
May 29, 2007
Aldarris
May 29, 2007
Regan Heath
May 29, 2007
Daniel Keep
May 29, 2007
Hello.

I have a nested function that iterates through a tree recursively. here is it code:

void recursiveXMLTreeIteration(XMLNode currentNode, int treeLevel)
{
	writefln(treeLevel);
	tabOffset.length = 0;
	for(int i = 0; i < treeLevel; i++)
		{tabOffset ~= "\t";}
.......
	foreach(XMLNode childNode; currentNode.getChildrenList())
		{recursiveXMLTreeIteration(childNode, treeLevel++);}
}

recursiveXMLTreeIteration(this, 0);

Does not work as expected, in a tree of a root node plus two child nodes it prints 0,0,1.

It treeLevel++; is moved outside, works as expected:
.......
        treeLevel++;
	foreach(XMLNode childNode; currentNode.getChildrenList())
		{recursiveXMLTreeIteration(childNode, treeLevel)
}


Prints 0,1,1,
May 29, 2007
Hi.

Shouldn't that be ++treeLevel?

In general var++ is an expression that returns var and leaves var with the value var + 1. ++var is an expression that returns var + 1 and leaves var with var + 1.

int x = 1;
int y = x++; // leaves y = 1, x = 2

int x = 1;
int y = ++x; // leaves y = 2, x = 2

Further, your two codes are differentes. In the first one you increment treeLevel in each foreach iteration, while on the second you increment it once before the foreach loop.

Best regards,
Ary

Aldarris escribió:
> Hello.
> 
> I have a nested function that iterates through a tree recursively.
> here is it code:
> 
> void recursiveXMLTreeIteration(XMLNode currentNode, int treeLevel)
> {
> 	writefln(treeLevel);
> 	tabOffset.length = 0;
> 	for(int i = 0; i < treeLevel; i++)
> 		{tabOffset ~= "\t";}
> .......			
> 	foreach(XMLNode childNode; currentNode.getChildrenList())
> 		{recursiveXMLTreeIteration(childNode, treeLevel++);}
> }
> 
> recursiveXMLTreeIteration(this, 0);
> 
> Does not work as expected, in a tree of a root node plus two child nodes it prints 0,0,1.
> 
> It treeLevel++; is moved outside, works as expected:
> .......			
>         treeLevel++;
> 	foreach(XMLNode childNode; currentNode.getChildrenList())
> 		{recursiveXMLTreeIteration(childNode, treeLevel)
> }
> 
> 
> Prints 0,1,1,
May 29, 2007
Ary Manzana Wrote:

> Hi.
> 
> Shouldn't that be ++treeLevel?
> 
> In general var++ is an expression that returns var and leaves var with the value var + 1. ++var is an expression that returns var + 1 and leaves var with var + 1.

Thanks.  Should have studied theory better.

> 
> int x = 1;
> int y = x++; // leaves y = 1, x = 2
> 
> int x = 1;
> int y = ++x; // leaves y = 2, x = 2
> 
> Further, your two codes are differentes. In the first one you increment treeLevel in each foreach iteration, while on the second you increment it once before the foreach loop.

Yes, that was the idea -- to send to the function not treeLevel, but a number higher than treeLevel by one and thus leaving treeLevel unchanged to call the function again from the same node.
Incrementing treeLevel elsewhere gives the desired result.
I have just found that the following:
{recursiveXMLTreeIteration(childNode, (treeLevel + 1));}
gives the desired result.

> Best regards,
> Ary
> 
> Aldarris escribió:
> > Hello.
> > 
> > I have a nested function that iterates through a tree recursively. here is it code:
> > 
> > void recursiveXMLTreeIteration(XMLNode currentNode, int treeLevel)
> > {
> > 	writefln(treeLevel);
> > 	tabOffset.length = 0;
> > 	for(int i = 0; i < treeLevel; i++)
> > 		{tabOffset ~= "\t";}
> > .......
> > 	foreach(XMLNode childNode; currentNode.getChildrenList())
> > 		{recursiveXMLTreeIteration(childNode, treeLevel++);}
> > }
> > 
> > recursiveXMLTreeIteration(this, 0);
> > 
> > Does not work as expected, in a tree of a root node plus two child nodes it prints 0,0,1.
> > 
> > It treeLevel++; is moved outside, works as expected:
> > .......
> >         treeLevel++;
> > 	foreach(XMLNode childNode; currentNode.getChildrenList())
> > 		{recursiveXMLTreeIteration(childNode, treeLevel)
> > }
> > 
> > 
> > Prints 0,1,1,

May 29, 2007

Aldarris wrote:
> Hello.
> 
> I have a nested function that iterates through a tree recursively. here is it code:
> 
> void recursiveXMLTreeIteration(XMLNode currentNode, int treeLevel)
> {
> 	writefln(treeLevel);
> 	tabOffset.length = 0;
> 	for(int i = 0; i < treeLevel; i++)
> 		{tabOffset ~= "\t";}
> ........
> 	foreach(XMLNode childNode; currentNode.getChildrenList())
> 		{recursiveXMLTreeIteration(childNode, treeLevel++);}
> }
> 
> recursiveXMLTreeIteration(this, 0);
> 
> Does not work as expected, in a tree of a root node plus two child nodes it prints 0,0,1.
> 
> It treeLevel++; is moved outside, works as expected:
> ........
>         treeLevel++;
> 	foreach(XMLNode childNode; currentNode.getChildrenList())
> 		{recursiveXMLTreeIteration(childNode, treeLevel)
> }
> 
> 
> Prints 0,1,1,

It's a bug alright: in your code.

treeLevel++ is post increment.  It evaluates "treeLevel" and THEN increments it.  You want pre increment: "++treeLevel".

	-- Daniel

-- 
int getRandomNumber()
{
    return 4; // chosen by fair dice roll.
              // guaranteed to be random.
}

http://xkcd.com/

v2sw5+8Yhw5ln4+5pr6OFPma8u6+7Lw4Tm6+7l6+7D i28a2Xs3MSr2e4/6+7t4TNSMb6HTOp5en5g6RAHCP  http://hackerkey.com/
May 29, 2007
Aldarris Wrote:
> I have just found that the following:
> {recursiveXMLTreeIteration(childNode, (treeLevel + 1));}
> gives the desired result.

The () around treeLevel + 1 are unnecessary - unless you like the look or think it clearer to read.  The compiler will always completely evaluate the argument before passing it to the function.

The only time you need braces is when using operators of differing precedence where you want the lower (higher? not sure which term is used) precedence operator to apply first, eg.

  {recursiveXMLTreeIteration(childNode, treeLevel + 1 * 2);}

the * is evaluated first in the above, whereas with:

  {recursiveXMLTreeIteration(childNode, (treeLevel + 1) * 2);}

the + is evaluated first.

You probably know all that already but someone else might be interested :)

Regan