Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2005
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2005

[Date Index] [Thread Index] [Author Index]

Search the Archive

Mathlink memory preservation

  • To: mathgroup at smc.vnet.net
  • Subject: [mg56455] Mathlink memory preservation
  • From: Bart Janssen <b.j.janssen at tue.nl>
  • Date: Tue, 26 Apr 2005 01:33:00 -0400 (EDT)
  • Organization: Eindhoven University of Technology, The Netherlands
  • Sender: owner-wri-mathgroup at wolfram.com

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


  • Prev by Date: Re: Format[ ] with \[OverBracket] in a package `Private` context
  • Next by Date: "large" matrices, Eigenvalues, determinants, characteristic polynomials
  • Previous by thread: Re: Using BarChart in a Widget
  • Next by thread: Re: Mathlink memory preservation