digitalmars.D.learn - Internal delegate and Stack Overflow
- tsalm (31/31) Nov 28 2008 Hello,
Hello, I would do something like this, but this return me an execution error : object.Exception: Stack Overflow // --------CODE-------- class A { void delegate() dg; void doIt() { dg(); } } class B { A a; this() { a = new A; a.dg = { doSomething(); }; } void doSomething() { } } void main() { auto b = new B; b.a.doIt(); } // ------END CODE------ Is this a bug or have I do something wrong ? Thanks in advance for your help, TSalm
Nov 28 2008
Reply to TSalm,Hello, I would do something like this, but this return me an execution error : object.Exception: Stack Overflow // --------CODE-------- class A { void delegate() dg; void doIt() { dg(); } } class B { A a; this() { a = new A; a.dg = { doSomething(); }; } void doSomething() { } } void main() { auto b = new B; b.a.doIt(); } // ------END CODE------ Is this a bug or have I do something wrong ? Thanks in advance for your help, TSalmIf this is d1.0 the error is that you are allowing an anon delegate to escape the enclosing function. a.dg = &this.doSomething; // this would be ok if that helps. if it is 2.0, I think this is correct.
Nov 28 2008
Le Sat, 29 Nov 2008 01:08:28 +0100, BCS <ao pathlink.com> a écrit:Reply to TSalm,Yes, it's on D1.036.Hello, I would do something like this, but this return me an execution error : object.Exception: Stack Overflow // --------CODE-------- class A { void delegate() dg; void doIt() { dg(); } } class B { A a; this() { a = new A; a.dg = { doSomething(); }; } void doSomething() { } } void main() { auto b = new B; b.a.doIt(); } // ------END CODE------ Is this a bug or have I do something wrong ? Thanks in advance for your help, TSalmIf this is d1.0 the error is that you are allowing an anon delegate to escape the enclosing function.a.dg = &this.doSomething; // this would be ok if that helps. if it is 2.0, I think this is correct.Yes, you are right. But this is an example code. The "true" code uses delegates with argument which differs from called functions, so I can't point delegate directly to them. And this anonymous function's way is really fastest to code... I must waiting for a D2 stable version ;-) Thanks
Nov 28 2008
Reply to TSalm,Yes, you are right. But this is an example code. The "true" code uses delegates with argument which differs from called functions, so I can't point delegate directly to them. And this anonymous function's way is really fastest to code... I must waiting for a D2 stable version ;-) Thanksyou can store off the values you need like this: struct C(R, A...) { A args; R function(A) dg; static R delegate() opCall(R function(A) dg, A a) { C!(R, A) ret; ret.dg=dg; foreach(int i,_;A) ret.args[i] = a[i]; return &ret.fn; } R fn() { return dg(args); } } // test it import std.stdio; int delegate() dg(int i) { return C!(int,int)(function int(int j){return j;}, i); // <--- used here } void main() { auto d = dg(5); writef("%s\n", d()); }
Nov 28 2008
Le Sat, 29 Nov 2008 01:49:20 +0100, BCS <ao pathlink.com> a écrit:struct C(R, A...) { A args; R function(A) dg; static R delegate() opCall(R function(A) dg, A a) { C!(R, A) ret; ret.dg=dg; foreach(int i,_;A) ret.args[i] = a[i]; return &ret.fn; } R fn() { return dg(args); } } // test it import std.stdio; int delegate() dg(int i) { return C!(int,int)(function int(int j){return j;}, i); // <--- used here } void main() { auto d = dg(5); writef("%s\n", d()); }Interesting code. Thanks!
Nov 29 2008