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

Reply via email to