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 >