On 23.12.2010 2:16, g g wrote:
Is this code :
import std.stdio;
import std.conv;
struct pt1{
p val;
pt1* next;
}
struct p{
int val;
string toString(){
return(to!string(val));
}
}
Here, notice that thefun is taking pt1 by value - a copy.
void thefun(pt1 x){
writeln(&x);
}
Then you take address of local copy, which is unacceptable. What you
probably wanted is this:
void thefun(ref pt1 x){//reference to the original , but then it must be lvalue
writeln(&x);
}
void main(){
auto p0 = p(1);
auto p1 = p(2);
auto p2 = p(3);
auto p3 = p(4);
p[] arr = [p0,p1,p2,p3];
writeln(arr);
foreach(r;arr){
thefun(pt1(r));
}
}
But here you pass a rvalue to function that takes address. In fact, it
prints the address of temporary place in stack used to hold result of
pt1(r).
supposed to output this:
1 2 3 4
BFE61E28
BFE61E28
BFE61E28
BFE61E28 //Note all the addresses are the same
It is expected that using a struct literal(or default constructor) on a bucle
reuses the same address?
Yes, inside loop it's likely to use the same address, but actually you
didn't took it but an address of a copy of it ;) Which means you need
to store these temporaries like pt1(r) somewhere, usually on heap (just
as you do with dynamic array of p).
I got hit by this trying to do a tree structure builder, for hours searching
aand finally found this (feature | bug). If so, how I could get a new struct to
void changing (in a unnoticeable way) the same struct i just set.
thanks.
g g
--
Dmitry Olshansky