www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Why do I get stack overflow?

reply Ary Borenszweig <ary esperanto.org.ar> writes:
When I compile this code I get "stack overflow" printed in the console. 
Anyone know why?

---
int fact(int X)() {
	if(X == 0) {
		return 1;
	} else {
		int temp = fact!(X - 1)();
		return X * temp;
	}
}

const someVar = fact!(0)();
---
May 24 2009
next sibling parent reply Moritz Warning <moritzwarning web.de> writes:
On Sun, 24 May 2009 20:49:53 -0300, Ary Borenszweig wrote:

 When I compile this code I get "stack overflow" printed in the console.
 Anyone know why?
 
 ---
 int fact(int X)() {
 	if(X == 0) {
 		return 1;
 	} else {
 		int temp = fact!(X - 1)();
 		return X * temp;
 	}
 }
 
 const someVar = fact!(0)();
 ---
Because you generate fact!(-1)(), fact!(-2)() and so on at compile time. You recursive template doesn't terminate.
May 24 2009
parent reply Ary Borenszweig <ary esperanto.org.ar> writes:
Moritz Warning escribió:
 On Sun, 24 May 2009 20:49:53 -0300, Ary Borenszweig wrote:
 
 When I compile this code I get "stack overflow" printed in the console.
 Anyone know why?

 ---
 int fact(int X)() {
 	if(X == 0) {
 		return 1;
 	} else {
 		int temp = fact!(X - 1)();
 		return X * temp;
 	}
 }

 const someVar = fact!(0)();
 ---
Because you generate fact!(-1)(), fact!(-2)() and so on at compile time. You recursive template doesn't terminate.
Thanks. Later in my head I instantiated the template and noticed the problem.
May 24 2009
parent bearophile <bearophileHUGS lycos.com> writes:
Ary Borenszweig:
 Thanks. Later in my head I instantiated the template and noticed the 
 problem.
In time I have created similar problems in my code 2-3 times, missing a "static" before some "if". Can't the compiler help spot such bugs? If the variables a dynamic if works on are constants (expecially if they are types) the compiler may give a warning... Bye, bearophile
May 25 2009
prev sibling parent Christopher Wright <dhasenan gmail.com> writes:
Ary Borenszweig wrote:
 When I compile this code I get "stack overflow" printed in the console. 
 Anyone know why?
 
 ---
 int fact(int X)() {
     if(X == 0) {
         return 1;
     } else {
         int temp = fact!(X - 1)();
         return X * temp;
     }
 }
 
 const someVar = fact!(0)();
 ---
Like Moritz said. You need to use "static if" there rather than "if".
May 24 2009