Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
st: Strange behaviour with Mata compiler
From
"Mak, Timothy" <[email protected]>
To
"[email protected]" <[email protected]>
Subject
st: Strange behaviour with Mata compiler
Date
Wed, 22 Dec 2010 17:44:46 +0000
Dear list,
While I was debugging a program, I discovered some strange behaviour with the Mata compiler. Can somebody show me why?
If we run the following code,
// Begin code
struct test {
real scalar a
}
function jkl() {
struct test scalar j, k
j.a = 1
k.a = 2
j
k
liststruct(j)
liststruct(k)
k = j
j
k
}
jkl()
// End code
In the above code, j and k are given separate pointers. Even when I assigned k = j, the pointers for j and k remain separate.
However, if I have an additional layer of structure, e.g.
// Begin code
struct test2 {
struct test scalar j
struct test vector k
}
function jkl2() {
struct test2 scalar S
S.j.a = 4
S.k = J(4, 1, test())
S.k[1].a = 6
S.j
S.k[1]
liststruct(S.j)
liststruct(S.k[1])
S.j = S.k[1]
S.j
S.k[1]
}
jkl2()
// End code
Then, I found that when I assigned S.j = S.k[1], the pointer for S.j takes on the value of S.k[1], unlike in the above. This is quite unexpected. Because if I then try to modify S.j, say by doing S.j.a = 20, the value of S.k[1].a changes also (to 20), and vice versa if I modify S.k[1].
However, on the other hand if I run the following:
// Begin code
function jkl3() {
struct test2 scalar S
S.j.a = 4
S.k = J(4, 1, test())
S.k[1].a = 6
S.j
S.k[1]
liststruct(S.j)
liststruct(S.k[1])
S.k[1] = S.j
S.j
S.k[1]
}
jkl3()
// End code
S.k[1] and S.j retain their separate pointer address.
Can someone tell me what the rationale is behind this behaviour?
Thanks a lot,
Tim
BTW I'm running Stata 10.1 on Windows.
*
* For searches and help try:
* http://www.stata.com/help.cgi?search
* http://www.stata.com/support/statalist/faq
* http://www.ats.ucla.edu/stat/stata/