Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.

# Re: st: Mata void functions and pointers

 From Matthew Baker To statalist@hsphsun2.harvard.edu Subject Re: st: Mata void functions and pointers Date Thu, 17 May 2012 21:06:32 -0400

```Brendan, Jeff, and Brian --

Best,

Matt

On Thu, May 17, 2012 at 6:41 PM, Jeff Pitblado, StataCorp LP
> Matthew Baker <matthew.baker@hunter.cuny.edu> is working with pointers in
> Mata.  Originally he wrote:
>
>> I have a problem in which I am trying to populate the elements of
>> a pointer with the results of a function. The problem is, the function
>> is void and returns its results through an argument, which makes
>> getting results into a pointer nontransparent. As a simple example,
>> consider the following:
>> (example omitted)
>
> Brendan Halpin <brendan.halpin@ul.ie> replied with a suggestion for Matthew's
> specific, but it did not address Mathew's general need, so Mathew gave us more
> information:
>
>> I should have been more clear! I would certainly prefer to use a
>> vector to collect the elements, but the objects I'm collecting are of
>> unknown dimension which is not known in advance, so perhaps I should
>> have used an example like:
>>
>> /* Begin example */
>> clear all
>> mata
>> void example(A,B,Ab) Ab=J(A+round(3*runiform(1,1)),B,1)
>> P=J(3,1,NULL)
>> for (i=1;i<=3;i++) {
>>       example(i,i,Ab=.)
>>       Ab
>>       P[i]=&Ab
>>                                  }
>>
>> /* display results */
>>
>> for (i=1;i<=3;i++) *P[i]
>> end
>> /* end example */
>>
>> I have thought about trying to readjust the dimensions of the vector
>> every time it is a little different, but this seems kind of clumsy and
>> I was hoping for a better alternative.
>
> Mathew can preallocate each element of the P vector with an address to it's
> own copy of a default Mata object, then pass that object to his 'example()'
> function.  Here is how that would work with Mathew's example above:
>
> ***** BEGIN:
> clear all
> mata:
> void example(A,B,Ab) Ab=J(A+round(3*runiform(1,1)),B,1)
> P=J(3,1,NULL)
> for (i=1;i<=3;i++) {
>        P[i] = &J(0,0,.)                // PREALLOCATION
>        example(i,i,*P[i])
>        *P[i]
> }
>
> /* display results */
>
> for (i=1;i<=3;i++) *P[i]
> end
> ***** END:
>
> --Jeff
> *
> *   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/

--
Dr. Matthew J. Baker
Department of Economics
Hunter College and the Graduate Center, CUNY

*
*   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/
```