| 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
Permalink
Reply