Re: Mathlink memory preservation
- To: mathgroup at smc.vnet.net
- Subject: [mg56488] Re: Mathlink memory preservation
- From: "Jens-Peer Kuska" <kuska at informatik.uni-leipzig.de>
- Date: Tue, 26 Apr 2005 21:52:47 -0400 (EDT)
- Organization: Uni Leipzig
- References: <d4kkpa$ebv$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Hi, if you some where call the destructor it has nothing to do with MathLink. MathLink knows nothing about your C++ classes and will not touch it. Regards Jens "Bart Janssen" <b.j.janssen at tue.nl> schrieb im Newsbeitrag news:d4kkpa$ebv$1 at smc.vnet.net... > Hello, > > I'm writing a C++ mathlink program that should > do some image processing. > > The main idea is: > 1. Load the image into the memory of the > mathlink module by > PreLoadImage[Image__?(MatrixQ[#, NumberQ]&)] > 2. Obtain a filter response from a filter > parameterised by a couple of > Reals (This way we don't have to send the entire > image over the link > over and over and thus obtain higher evaluation > speeds). > > Problem: > After the preload function is called, the > destructor of my image is > magically called. Because of this the data is > not available to the > filter function. > > Question: > How can I make sure my data stays in memory? > (Suggestions on improving the code are welcome > too :) ) > > > Source Code looks like this: > //----------------------------------------- > #include <mathlink and other stuff> > > // global variable that holds the image that is > processed > PixelMap<double> *image; > > > // > // Load the image data from mathematica into > // the global variable image > // > void preloadimage(){ > double* points; > long *pdims; > long prank; > > MLGetRealArray(stdlink, &points, > &pdims,NULL,&prank); > > // Remove the old image from memory > // Appearantly mathlink does this for > me... > /* if(image!=NULL) > delete image; > */ > > image = new > PixelMap<double>(pdims[1],pdims[0]); > > for(int y=0;y<pdims[0];y++) > for(int x=0;x<pdims[1];x++) > > image->SetPixel(x,y,points[pdims[1]*y+x]); > > #ifdef DEBUG > std::ofstream file > ("/home/TUE/bjanssen/debug.txt"); > file << *image << std::endl; > file.close(); > #endif > > // some junk that for "some" reason has to be > here > MLNewPacket(stdlink); > MLPutInteger(stdlink,1); > } > > // > // Return a filter response from a filter > // applied on global image > // NOTE: preloadimage has to be called on > forehand > // > void filter() > { > // ... same trickery as above, but then for > other arguments > double retval = filter(args,image); > > MLNewPacket(stdlink); > MLPutReal(stdlink,retval); > } > //----------------------------------------- > > Thanks in advance, > Kind Regards, > Bart Janssen >