Re: Problems using MathLink
- To: mathgroup at smc.vnet.net
- Subject: [mg95316] Re: Problems using MathLink
- From: Steve Wilson <stevew at wolfram.com>
- Date: Thu, 15 Jan 2009 06:11:37 -0500 (EST)
- References: <gkgq0p$48v$1@smc.vnet.net> <200901141031.FAA17019@smc.vnet.net> <A6D29BB9-24ED-4F10-90C5-F86B4A92DFD3@wolfram.com> <496E545D.8080306@informatik.uni-leipzig.de>
Yes, you need to call delete[] for the dims array. On Jan 14, 2009, at 2:08 PM, Jens-Peer Kuska wrote: > Hi, > > you also not free the memory ! > > void rot(MLINK link, double theta) > { > > /* > Because the original function was only sending Heads of type List, > We can simply pass MLPutRealArray a NULL pointer for the heads > argument and MathLink will send the head List for each level of the > array. > */ > > double a[3][3]; > a[0][0] = cos(theta); a[0][1] = sin(theta); a[0][2] = 0; > a[1][0] = - sin(theta); a[1][1] = cos(theta); a[1][2] = 0; > a[2][0] = 0; a[2][1] = 0; a[2][2] = 1; > > long *dims, depth; > > /* > The array is only depth 2. The original version told MLPutRealArray > that > the data array 'a' had a depth of 3. MLPutRealArray tried to send > the extra dimension > which didn't actually exist which lead to the crash. > */ > > dims = new long[2]; > dims[0] = 3; dims[1] = 3; > MLPutRealArray(link, *a, dims, (char **)0, 2); > > /************************************************* > because otherwise, every call waste 32 byte of heap memory > ************************************************/ > delete[] dims; > } > > Regards > Jens > > Steve Wilson wrote: >> Here are the modifications that this function needs in order to >> work correctly: >> >> void rot(MLINK link, double theta) >> { >> >> /* >> Because the original function was only sending Heads of type List, >> We can simply pass MLPutRealArray a NULL pointer for the heads >> argument and MathLink will send the head List for each level of the >> array. >> */ >> >> double a[3][3]; >> a[0][0] = cos(theta); >> a[0][1] = sin(theta); >> a[0][2] = 0; >> a[1][0] = - sin(theta); >> a[1][1] = cos(theta); >> a[1][2] = 0; >> a[2][0] = 0; >> a[2][1] = 0; >> a[2][2] = 1; >> >> long *dims, depth; >> >> /* >> The array is only depth 2. The original version told >> MLPutRealArray that >> the data array 'a' had a depth of 3. MLPutRealArray tried to send >> the extra dimension >> which didn't actually exist which lead to the crash. >> */ >> >> dims = new long[2]; >> dims[0] = 3; >> dims[1] = 3; >> MLPutRealArray(link, *a, dims, (char **)0, 2); >> } >> >> >> Steve Wilson >> Senior Network/System Protocol Developer >> Wolfram Research, Inc. >> >> >> On Jan 14, 2009, at 3:31 AM, Jens-Peer Kuska wrote: >> >>> Hi, >>> >>> you are sure that your array has the depth 3 and not >>> the dimension 3 x 3, and what is the third dimension >>> in a[3][3] .. >>> >>> BTW, you never delete[] heads,dims. >>> If you wish to fill your main memory you should >>> use larger pieces of memory >>> that you don't recycle, you are faster done than. >>> >>> Regards >>> Jens >>> >>> Jonathan Yik wrote: >>>> Hi, >>>> >>>> I'm trying to write a subroutine in C++ that passes a rotation >>>> matrix to >>>> Mathematica through MathLink. The code compiles fine, but when I >>>> try to run >>>> the compiled program, I get a segfault at the point in the >>>> program where the >>>> subroutine is called. As far as I can tell, the fault occurs >>>> whenever the >>>> program calls MLPutRealArray or MLPutReal32Array. >>>> >>>> Here is my code for the subroutine: >>>> >>>> void rot(MLINK link, double theta) >>>> { >>>> char **heads, **HEAD; >>>> heads = new char*[3]; >>>> heads[0] = "List"; >>>> heads[1] = "List"; >>>> heads[2] = "List"; >>>> double a[3][3], *b; >>>> a[0][0] = cos(theta); >>>> a[0][1] = sin(theta); >>>> a[0][2] = 0; >>>> a[1][0] = - sin(theta); >>>> a[1][1] = cos(theta); >>>> a[1][2] = 0; >>>> a[2][0] = 0; >>>> a[2][1] = 0; >>>> a[2][2] = 1; >>>> long *dims, *D, depth; >>>> dims = new long[3]; >>>> dims[0] = 3; >>>> dims[1] = 3; >>>> dims[2] = 3; >>>> MLPutRealArray(link, *a, dims, heads, 3); >>>> } >>>> >>>> Is there something in this code that I'm missing that causes the >>>> fault? Or >>>> is this a but in the ml32i3.dll file? >>>> >>>> Yours, >>>> >>>> Johnathan Yik >> >>
- Follow-Ups:
- webMathematica - comments, opinions, user group (?)
- From: "Scot Martin" <smartin@seas.harvard.edu>
- webMathematica - comments, opinions, user group (?)