Re: Problems using MathLink
- To: mathgroup at smc.vnet.net
- Subject: [mg95313] Re: Problems using MathLink
- From: Jens-Peer Kuska <kuska at informatik.uni-leipzig.de>
- Date: Thu, 15 Jan 2009 06:11:03 -0500 (EST)
- References: <gkgq0p$48v$1@smc.vnet.net> <200901141031.FAA17019@smc.vnet.net> <A6D29BB9-24ED-4F10-90C5-F86B4A92DFD3@wolfram.com>
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 > >