Re: problem with MLGetReal64Array
- To: mathgroup at smc.vnet.net
- Subject: [mg84837] Re: problem with MLGetReal64Array
- From: Jens-Peer Kuska <kuska at informatik.uni-leipzig.de>
- Date: Wed, 16 Jan 2008 03:28:34 -0500 (EST)
- Organization: Uni Leipzig
- References: <fm9an9$ipe$1@smc.vnet.net> <fmf7q3$dm1$1@smc.vnet.net> <fmhpu1$b9q$1@smc.vnet.net>
- Reply-to: kuska at informatik.uni-leipzig.de
Hi,
I would Flatten[] the array and read the dimensions
separate, i.e., send a variable that contain the dimensions
and a flat array with the values in the array. In the C-code
the dimensions are read first and put into the data structure
you have for the n-dimensional array. My image processing package
has definitions like
template <>
Image<int>::Image(int nX, int nY,int ch, MLINK link): nx(nX), ny(nY),
channelNo(ch) {
int *data;
long len;
pixelSize=nx*ny*channelNo;
byteSize=nx*ny*channelNo*sizeof(int);
MLGetIntegerList(link,&data,&len);
if(len==0 || len!=nx*ny*channelNo) {
fprintf(stderr,
"Error creating Image<int> form MathLink. Need %d pixels got %ld.",
pixelSize,len);
bm=NULL;
}
else {
bm=new int[pixelSize];
memcpy(bm,data,byteSize);
}
MLDisownIntegerList(link,data,len);
};
and I call my C-functions always with
myFunction[Sequence @@ Dimensions[imageData],Flatten[imageData]]
...
But you can walk into the structure of your n-dimensional array
with reading heads and list length ..
Regards
Jens
GS wrote:
> On Jan 14, 12:51 am, Jens-Peer Kuska <ku... at informatik.uni-leipzig.de>
> wrote:
>> Hi,
>>
>> and you think that the Mathematica Kernel know that
>> you wish to get a Real64Array[] and not a
>> List[List[___Real]..]
>> ??
>>
>> Regards
>> Jens
>>
>> GS wrote:
>>> I am trying to compile a c program that uses MathLink, to be able to
>>> execute an external c-code from Mathematica. I use Mathematica 6.0.1
>>> on Windows XP and a gcc compiler from cygwin with -mno-cygwin option.
>>> There were no problems with compiling and running the addtwo example
>>> rom the Mathematica tutorial. Since I will need to transfer arrays
>>> from and to Mathematica, I also want to learn how to use MLPutReal64Array
>>> and MLGetReal64Array functions.
>>> I did not have a problem with compiling an example with
>>> MLPutReal64Array from Mathematica online tutorial. However, the following
>>> example with MLGetReal64Array does not work for me (see the code
>>> below). The code compiles without errors, however, when I Install[]
>>> it, and run the command
>>> getRealArray[{{1., 2.}, {4., 5.}}]
>>> it crashes the link with the message "LinkObject::linkd: Unable to
>>> communicate with closed link ...".
>>> Did anybody succeed in compiling this example?
>>> Thanks.
>>> PS. My attempt to compile with Microsoft Visual C gives the same
>>> result (link crash).
>>> ******************** array.c ***************************
>>> #include "mathlink.h"
>>> /* read an array of double-precision floating-point numbers from a
>>> link */
>>> void get_real_array(MLINK lp)
>>> {
>>> double *data;
>>> int *dims;
>>> char **heads;
>>> int d; /* stores the rank of the array */
>>> if(! MLGetReal64Array(lp, &data, &dims, &heads, &d))
>>> {
>>> /* unable to read the array from lp */
>>> return;
>>> }
>>> MLReleaseReal64Array(lp, data, dims, heads, d);
>>> }
>>> int main(int argc, char* argv[])
>>> {
>>> return MLMain(argc, argv);
>>> }
>>> ********************* end of array.c****************************
>>> ********************* array.tm********************************
>>> :Begin:
>>> :Function: get_real_array
>>> :Pattern: getRealArray[x_]
>>> :Arguments: {x}
>>> :ArgumentTypes: {Manual}
>>> :ReturnType: Null
>>> :End:
>>> :Evaluate: getRealArray::usage = "gets a matrix of reals."
>>> **************************************************************
>
> Hi Jens,
> I am not sure that I understand your question, but it looks like you
> see what my problem is.
> I would appreciate it very much if you could point out how I should
> fix the code.
> Thank you.
> GS
>