On 02/04/2015 10:42 PM, zhmt wrote:
Here is a simple code snippet:
class A {
public int[] arr;
}
class B {
public int[] arr;
}
void main()
{
int[] arr;
A a = new A;
B b = new B;
a.arr = arr;
b.arr = arr;
arr ~= 1;
arr ~= -2;
foreach(data; a.arr)
{
writeln(data);
}
foreach(data; b.arr)
{
writeln(data);
}
}
it prints nothing, I know that a.arr and b.arr are all slices of arr.
But if a and b want to reference the global arr, it means that any
changes in arr will be seen by a and b, and vice versa.
How to?
Thanks ahead.
First, in order to get what you want, add 4 starts and 2 ampersands so
that there is one array and two pointers to it:
import std.stdio;
class A {
public int[] * arr; // <-- *
}
class B {
public int[] * arr; // <-- *
}
void main()
{
int[] arr;
A a = new A;
B b = new B;
a.arr = &arr; // <-- &
b.arr = &arr; // <-- &
arr ~= 1;
arr ~= -2;
foreach(data; *a.arr) // <-- *
{
writeln(data);
}
foreach(data; *b.arr) // <-- *
{
writeln(data);
}
}
The output:
1
-2
1
-2
Appending to a slice breaks its sharing relationship with other slices.
The following article is very informative:
http://dlang.org/d-array-article.html
Ali