Thread overview | ||||||
---|---|---|---|---|---|---|
|
September 12, 2014 Extremely funny behavior .. could be a bug? | ||||
---|---|---|---|---|
| ||||
consider the following : in file a.d module a; class class_a { struct RESULT{ string[] raw; void* res; } RESULT r; void dothing() { r = new RESULT; string aa = "string"; r.raw ~= aa; r.res = cast(void*) aa; } } in file b.d import a; // import path is okey class class_b; { void doThings(class_a * ptr_a) { class_a A = &ptr_a; writeln(A.r.raw[0]); // prints aa; writeln(A.r.res); // fails : core.exception.OutOfMemoryError@(0) // but if i do comment the line : // writeln(A.r.raw[0]); out, then works } } in file c.d import a; import b; void main() { clsa = new class_a; clsb = new class_b; clsa.dothing(); clsa.doThings( & clsa); } I can not find a reason why accessing A.r.raw will erase (invoke the garbage collector) to remove A.r.res. Please help. |
September 12, 2014 Re: Extremely funny behavior .. could be a bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to seany | There are multiple problems with the code. Is that really what you are using? On 09/12/2014 06:35 AM, seany wrote: > consider the following : > > in file a.d > > module a; > > class class_a > { > > struct RESULT{ > string[] raw; > void* res; > } > > > RESULT r; > > void dothing() > { > r = new RESULT; Error: cannot implicitly convert expression (new RESULT) of type RESULT* to RESULT > > string aa = "string"; > > r.raw ~= aa; > r.res = cast(void*) aa; > } > > } > > > in file b.d > > import a; // import path is okey > > class class_b; That semicolon should not be there? > { > > void doThings(class_a * ptr_a) > { > class_a A = &ptr_a; Error: cannot implicitly convert expression (& ptr_a) of type class_a** to a.class_a [...] Ali |
September 12, 2014 Re: Extremely funny behavior .. could be a bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | On Friday, 12 September 2014 at 15:26:34 UTC, Ali Çehreli wrote: you are right, it was a reduced form, of a very complex software. in file a.d module a; class class_a { struct RESULT{ string[] raw; void* res; } RESULT * r; void dothing() { r = new RESULT; string aa = "string"; r.raw ~= aa; r.res = cast(void*) aa; } } in file b.d import a; // import path is okey class class_b { void doThings(class_a * ptr_a) { class_a A = *ptr_a; writeln(A.r.raw[0]); // prints aa; writeln(A.r.res); // fails : core.exception.OutOfMemoryError@(0) // but if i do comment the line : // writeln(A.r.raw[0]); out, then works } } in file c.d import a; import b; void main() { clsa = new class_a; clsb = new class_b; clsa.dothing(); clsa.doThings( & clsa); } |
September 12, 2014 Re: Extremely funny behavior .. could be a bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to seany | On 09/12/2014 12:16 PM, seany wrote: > On Friday, 12 September 2014 at 15:26:34 UTC, Ali Çehreli wrote: > > > you are right, it was a reduced form, of a very complex software. Maybe others can figure it out by reading the code but a working code that reproduces the problem is very important for me. :) I still had to do three modifications: 1) In b.d, add 'import std.stdio;' 2) In c.d, use 'auto' when constructing clsa and clsb 3) In c.d, call doThings() on clsb, not clsa Unfortunately, there were no errors for me with a very recent dmd git head and I got the following output: string 4293D0 Ali |
Copyright © 1999-2021 by the D Language Foundation