<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235382</link>
    <title>MATLAB Central Newsreader - C++ mex question</title>
    <description>Feed for thread: C++ mex question</description>
    <language>en-us</language>
    <copyright>&amp;copy;1994-2012 by MathWorks, Inc.</copyright>
    <webmaster>webmaster@mathworks.com</webmaster>
    <generator>MATLAB Central Newsreader</generator>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <ttl>60</ttl>
    <image>
      <title>MathWorks</title>
      <url>http://www.mathworks.com/images/membrane_icon.gif</url>
    </image>
    <item>
      <pubDate>Mon, 01 Sep 2008 01:26:02 -0400</pubDate>
      <title>C++ mex question</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235382#598150</link>
      <author>Siva Mettupalayam</author>
      <description>Hi,&lt;br&gt;
&lt;br&gt;
I am using Matlab R2008a 64 bit and MSVC++ 9.0 (Visual &lt;br&gt;
Studio 2008) on Windows Vista 64 bit. I compile the &lt;br&gt;
following mex function&lt;br&gt;
&lt;br&gt;
#include &quot;mex.h&quot;&lt;br&gt;
#include &amp;lt;iostream&amp;gt;&lt;br&gt;
using namespace std;&lt;br&gt;
&lt;br&gt;
extern &quot;C&quot;&lt;br&gt;
void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const &lt;br&gt;
mxArray *prhs[])&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout &amp;lt;&amp;lt; &quot;Test&quot; &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; flush;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//printf(&quot;Test\n&quot;);&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
The cout doesn't result in anything being displayed.&lt;br&gt;
&lt;br&gt;
Section 26 of the tech note &lt;br&gt;
&lt;a href=&quot;http://www.mathworks.com/support/tech-notes/1600/1605.html&quot;&gt;http://www.mathworks.com/support/tech-notes/1600/1605.html&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
does say &quot;Using cout will not work as expected in C++ MEX-&lt;br&gt;
files. This is because cout is expecting to use a display &lt;br&gt;
that is not MATLAB. To workaround this problem, use &lt;br&gt;
mexPrintf instead.&quot;. However,&lt;br&gt;
1. This mex function works with Matlab R14 and MSVC++ 7.1 &lt;br&gt;
(Visual Studio 2003) on Windows XP. &lt;br&gt;
2. I am using some C++ template libraries that use cout. So &lt;br&gt;
I cannot change them to mexPrintf.&lt;br&gt;
3. The commented printf call works. Aren't cout and printf &lt;br&gt;
using the same output device?&lt;br&gt;
&lt;br&gt;
Thank you for your help.&lt;br&gt;
&lt;br&gt;
Siva</description>
    </item>
    <item>
      <pubDate>Tue, 02 Sep 2008 09:25:54 -0400</pubDate>
      <title>Re: C++ mex question</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235382#598293</link>
      <author>Bill August</author>
      <description>&amp;gt; Hi,&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; I am using Matlab R2008a 64 bit and MSVC++ 9.0&lt;br&gt;
&amp;gt; (Visual &lt;br&gt;
&amp;gt; Studio 2008) on Windows Vista 64 bit. I compile the &lt;br&gt;
&amp;gt; following mex function&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; #include &quot;mex.h&quot;&lt;br&gt;
&amp;gt; #include &amp;lt;iostream&amp;gt;&lt;br&gt;
&amp;gt; using namespace std;&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; extern &quot;C&quot;&lt;br&gt;
&amp;gt; void mexFunction(int nlhs,mxArray *plhs[],int&lt;br&gt;
&amp;gt; nrhs,const &lt;br&gt;
&amp;gt; mxArray *prhs[])&lt;br&gt;
&amp;gt; {&lt;br&gt;
&amp;gt;     cout &amp;lt;&amp;lt; &quot;Test&quot; &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; flush;&lt;br&gt;
&amp;gt;     //printf(&quot;Test\n&quot;);&lt;br&gt;
&amp;gt; }&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; The cout doesn't result in anything being displayed.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Section 26 of the tech note &lt;br&gt;
&amp;gt; &lt;a href=&quot;http://www.mathworks.com/support/tech-notes/1600/1605.&quot;&gt;http://www.mathworks.com/support/tech-notes/1600/1605.&lt;/a&gt;&lt;br&gt;
&amp;gt; html&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; does say &quot;Using cout will not work as expected in C++&lt;br&gt;
&amp;gt; MEX-&lt;br&gt;
&amp;gt; files. This is because cout is expecting to use a&lt;br&gt;
&amp;gt; display &lt;br&gt;
&amp;gt; that is not MATLAB. To workaround this problem, use &lt;br&gt;
&amp;gt; mexPrintf instead.&quot;. However,&lt;br&gt;
&amp;gt; 1. This mex function works with Matlab R14 and MSVC++&lt;br&gt;
&amp;gt; 7.1 &lt;br&gt;
&amp;gt; (Visual Studio 2003) on Windows XP. &lt;br&gt;
&amp;gt; 2. I am using some C++ template libraries that use&lt;br&gt;
&amp;gt; cout. So &lt;br&gt;
&amp;gt; I cannot change them to mexPrintf.&lt;br&gt;
&amp;gt; 3. The commented printf call works. Aren't cout and&lt;br&gt;
&amp;gt; printf &lt;br&gt;
&amp;gt; using the same output device?&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Thank you for your help.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Siva&lt;br&gt;
Hi Siva,&lt;br&gt;
My solution is to open a new console window for cout. It may help you to solve the problem.&lt;br&gt;
Regards.&lt;br&gt;
&lt;br&gt;
------file coutdemo.cpp-----&lt;br&gt;
// Usage:&lt;br&gt;
//        show how to open a console window for matlab to handle cout message&lt;br&gt;
// Input:&lt;br&gt;
//        none&lt;br&gt;
// Output:&lt;br&gt;
//        none&lt;br&gt;
&lt;br&gt;
#include &quot;mex.h&quot;&lt;br&gt;
#include &amp;lt;windows.h&amp;gt;&lt;br&gt;
#include &amp;lt;iostream&amp;gt;&lt;br&gt;
#include &quot;guicon.h&quot;&lt;br&gt;
using namespace std ;&lt;br&gt;
&lt;br&gt;
void mexFunction(int nlhs, mxArray *phs[], int nrhs, const mxArray *prhs[])&lt;br&gt;
{&lt;br&gt;
	// redirect&lt;br&gt;
	RedirectIOToConsole();&lt;br&gt;
	// print&lt;br&gt;
	cout&amp;lt;&amp;lt;&quot;cout demo&quot;&amp;lt;&amp;lt;endl;&lt;br&gt;
	// wait for kill&lt;br&gt;
	cin.get() ;&lt;br&gt;
	// kill the console&lt;br&gt;
	FreeConsole() ;&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
-----file guicon.h------&lt;br&gt;
#ifndef __GUICON_H__&lt;br&gt;
#define __GUICON_H__&lt;br&gt;
#ifdef _DEBUG&lt;br&gt;
&lt;br&gt;
void RedirectIOToConsole();&lt;br&gt;
&lt;br&gt;
#endif&lt;br&gt;
#endif&lt;br&gt;
/* End of File */&lt;br&gt;
&lt;br&gt;
-----file guicon.cpp------&lt;br&gt;
#include &amp;lt;windows.h&amp;gt;&lt;br&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br&gt;
#include &amp;lt;io.h&amp;gt;&lt;br&gt;
#include &amp;lt;iostream&amp;gt;&lt;br&gt;
#include &amp;lt;fstream&amp;gt;&lt;br&gt;
#ifndef _USE_OLD_IOSTREAMS&lt;br&gt;
using namespace std;&lt;br&gt;
#endif&lt;br&gt;
&lt;br&gt;
// maximum mumber of lines the output console should have&lt;br&gt;
static const WORD MAX_CONSOLE_LINES = 500;&lt;br&gt;
#ifdef _DEBUG&lt;br&gt;
&lt;br&gt;
void RedirectIOToConsole()&lt;br&gt;
{&lt;br&gt;
int hConHandle;&lt;br&gt;
long lStdHandle;&lt;br&gt;
CONSOLE_SCREEN_BUFFER_INFO coninfo;&lt;br&gt;
FILE *fp;&lt;br&gt;
&lt;br&gt;
// allocate a console for this app&lt;br&gt;
AllocConsole();&lt;br&gt;
&lt;br&gt;
// set the screen buffer to be big enough to let us scroll text&lt;br&gt;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &amp;coninfo);&lt;br&gt;
coninfo.dwSize.Y = MAX_CONSOLE_LINES;&lt;br&gt;
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), &lt;br&gt;
coninfo.dwSize);&lt;br&gt;
&lt;br&gt;
// redirect unbuffered STDOUT to the console&lt;br&gt;
lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);&lt;br&gt;
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);&lt;br&gt;
fp = _fdopen( hConHandle, &quot;w&quot; );&lt;br&gt;
*stdout = *fp;&lt;br&gt;
setvbuf( stdout, NULL, _IONBF, 0 );&lt;br&gt;
&lt;br&gt;
// redirect unbuffered STDIN to the console&lt;br&gt;
lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE);&lt;br&gt;
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);&lt;br&gt;
fp = _fdopen( hConHandle, &quot;r&quot; );&lt;br&gt;
*stdin = *fp;&lt;br&gt;
setvbuf( stdin, NULL, _IONBF, 0 );&lt;br&gt;
&lt;br&gt;
// redirect unbuffered STDERR to the console&lt;br&gt;
lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE);&lt;br&gt;
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);&lt;br&gt;
fp = _fdopen( hConHandle, &quot;w&quot; );&lt;br&gt;
*stderr = *fp;&lt;br&gt;
setvbuf( stderr, NULL, _IONBF, 0 );&lt;br&gt;
&lt;br&gt;
// make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog &lt;br&gt;
// point to console as well&lt;br&gt;
ios::sync_with_stdio();&lt;br&gt;
}&lt;br&gt;
#endif&lt;br&gt;
/* End of File */</description>
    </item>
    <item>
      <pubDate>Thu, 25 Sep 2008 14:21:38 -0400</pubDate>
      <title>Re: C++ mex question</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235382#602073</link>
      <author>rych</author>
      <description>On Sep 2, 10:25=A0am, Bill August &amp;lt;hui.s...@beds.ac.uk&amp;gt; wrote:&lt;br&gt;
&amp;gt; &amp;gt; Hi,&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; I am using Matlab R2008a 64 bit and MSVC++ 9.0&lt;br&gt;
&amp;gt; &amp;gt; (Visual&lt;br&gt;
&amp;gt; &amp;gt; Studio 2008) on Windows Vista 64 bit. I compile the&lt;br&gt;
&amp;gt; &amp;gt; following mex function&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; #include &quot;mex.h&quot;&lt;br&gt;
&amp;gt; &amp;gt; #include &amp;lt;iostream&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; using namespace std;&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; extern &quot;C&quot;&lt;br&gt;
&amp;gt; &amp;gt; void mexFunction(int nlhs,mxArray *plhs[],int&lt;br&gt;
&amp;gt; &amp;gt; nrhs,const&lt;br&gt;
&amp;gt; &amp;gt; mxArray *prhs[])&lt;br&gt;
&amp;gt; &amp;gt; {&lt;br&gt;
&amp;gt; &amp;gt; =A0 =A0 cout &amp;lt;&amp;lt; &quot;Test&quot; &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; flush;&lt;br&gt;
&amp;gt; &amp;gt; =A0 =A0 //printf(&quot;Test\n&quot;);&lt;br&gt;
&amp;gt; &amp;gt; }&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; The cout doesn't result in anything being displayed.&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; Section 26 of the tech note&lt;br&gt;
&amp;gt; &amp;gt;&lt;a href=&quot;http://www.mathworks.com/support/tech-notes/1600/1605.&quot;&gt;http://www.mathworks.com/support/tech-notes/1600/1605.&lt;/a&gt;&lt;br&gt;
&amp;gt; &amp;gt; html&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; does say &quot;Using cout will not work as expected in C++&lt;br&gt;
&amp;gt; &amp;gt; MEX-&lt;br&gt;
&amp;gt; &amp;gt; files. This is because cout is expecting to use a&lt;br&gt;
&amp;gt; &amp;gt; display&lt;br&gt;
&amp;gt; &amp;gt; that is not MATLAB. To workaround this problem, use&lt;br&gt;
&amp;gt; &amp;gt; mexPrintf instead.&quot;. However,&lt;br&gt;
&amp;gt; &amp;gt; 1. This mex function works with Matlab R14 and MSVC++&lt;br&gt;
&amp;gt; &amp;gt; 7.1&lt;br&gt;
&amp;gt; &amp;gt; (Visual Studio 2003) on Windows XP.&lt;br&gt;
&amp;gt; &amp;gt; 2. I am using some C++ template libraries that use&lt;br&gt;
&amp;gt; &amp;gt; cout. So&lt;br&gt;
&amp;gt; &amp;gt; I cannot change them to mexPrintf.&lt;br&gt;
&amp;gt; &amp;gt; 3. The commented printf call works. Aren't cout and&lt;br&gt;
&amp;gt; &amp;gt; printf&lt;br&gt;
&amp;gt; &amp;gt; using the same output device?&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; Thank you for your help.&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; Siva&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; Hi Siva,&lt;br&gt;
&amp;gt; My solution is to open a new console window for cout. It may help you to =&lt;br&gt;
solve the problem.&lt;br&gt;
&amp;gt; Regards.&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; ------file coutdemo.cpp-----&lt;br&gt;
&amp;gt; // Usage:&lt;br&gt;
&amp;gt; // =A0 =A0 =A0 =A0show how to open a console window for matlab to handle =&lt;br&gt;
cout message&lt;br&gt;
&amp;gt; // Input:&lt;br&gt;
&amp;gt; // =A0 =A0 =A0 =A0none&lt;br&gt;
&amp;gt; // Output:&lt;br&gt;
&amp;gt; // =A0 =A0 =A0 =A0none&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; #include &quot;mex.h&quot;&lt;br&gt;
&amp;gt; #include &amp;lt;windows.h&amp;gt;&lt;br&gt;
&amp;gt; #include &amp;lt;iostream&amp;gt;&lt;br&gt;
&amp;gt; #include &quot;guicon.h&quot;&lt;br&gt;
&amp;gt; using namespace std ;&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; void mexFunction(int nlhs, mxArray *phs[], int nrhs, const mxArray *prhs[=&lt;br&gt;
])&lt;br&gt;
&amp;gt; {&lt;br&gt;
&amp;gt; =A0 =A0 =A0 =A0 // redirect&lt;br&gt;
&amp;gt; =A0 =A0 =A0 =A0 RedirectIOToConsole();&lt;br&gt;
&amp;gt; =A0 =A0 =A0 =A0 // print&lt;br&gt;
&amp;gt; =A0 =A0 =A0 =A0 cout&amp;lt;&amp;lt;&quot;cout demo&quot;&amp;lt;&amp;lt;endl;&lt;br&gt;
&amp;gt; =A0 =A0 =A0 =A0 // wait for kill&lt;br&gt;
&amp;gt; =A0 =A0 =A0 =A0 cin.get() ;&lt;br&gt;
&amp;gt; =A0 =A0 =A0 =A0 // kill the console&lt;br&gt;
&amp;gt; =A0 =A0 =A0 =A0 FreeConsole() ;&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; }&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; -----file guicon.h------&lt;br&gt;
&amp;gt; #ifndef __GUICON_H__&lt;br&gt;
&amp;gt; #define __GUICON_H__&lt;br&gt;
&amp;gt; #ifdef _DEBUG&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; void RedirectIOToConsole();&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; #endif&lt;br&gt;
&amp;gt; #endif&lt;br&gt;
&amp;gt; /* End of File */&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; -----file guicon.cpp------&lt;br&gt;
&amp;gt; #include &amp;lt;windows.h&amp;gt;&lt;br&gt;
&amp;gt; #include &amp;lt;stdio.h&amp;gt;&lt;br&gt;
&amp;gt; #include &amp;lt;fcntl.h&amp;gt;&lt;br&gt;
&amp;gt; #include &amp;lt;io.h&amp;gt;&lt;br&gt;
&amp;gt; #include &amp;lt;iostream&amp;gt;&lt;br&gt;
&amp;gt; #include &amp;lt;fstream&amp;gt;&lt;br&gt;
&amp;gt; #ifndef _USE_OLD_IOSTREAMS&lt;br&gt;
&amp;gt; using namespace std;&lt;br&gt;
&amp;gt; #endif&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; // maximum mumber of lines the output console should have&lt;br&gt;
&amp;gt; static const WORD MAX_CONSOLE_LINES =3D 500;&lt;br&gt;
&amp;gt; #ifdef _DEBUG&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; void RedirectIOToConsole()&lt;br&gt;
&amp;gt; {&lt;br&gt;
&amp;gt; int hConHandle;&lt;br&gt;
&amp;gt; long lStdHandle;&lt;br&gt;
&amp;gt; CONSOLE_SCREEN_BUFFER_INFO coninfo;&lt;br&gt;
&amp;gt; FILE *fp;&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; // allocate a console for this appAllocConsole();&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; // set the screen buffer to be big enough to let us scroll text&lt;br&gt;
&amp;gt; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &amp;coninfo);&lt;br&gt;
&amp;gt; coninfo.dwSize.Y =3D MAX_CONSOLE_LINES;&lt;br&gt;
&amp;gt; SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE),&lt;br&gt;
&amp;gt; coninfo.dwSize);&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; // redirect unbuffered STDOUT to the console&lt;br&gt;
&amp;gt; lStdHandle =3D (long)GetStdHandle(STD_OUTPUT_HANDLE);&lt;br&gt;
&amp;gt; hConHandle =3D _open_osfhandle(lStdHandle, _O_TEXT);&lt;br&gt;
&amp;gt; fp =3D _fdopen( hConHandle, &quot;w&quot; );&lt;br&gt;
&amp;gt; *stdout =3D *fp;&lt;br&gt;
&amp;gt; setvbuf( stdout, NULL, _IONBF, 0 );&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; // redirect unbuffered STDIN to the console&lt;br&gt;
&amp;gt; lStdHandle =3D (long)GetStdHandle(STD_INPUT_HANDLE);&lt;br&gt;
&amp;gt; hConHandle =3D _open_osfhandle(lStdHandle, _O_TEXT);&lt;br&gt;
&amp;gt; fp =3D _fdopen( hConHandle, &quot;r&quot; );&lt;br&gt;
&amp;gt; *stdin =3D *fp;&lt;br&gt;
&amp;gt; setvbuf( stdin, NULL, _IONBF, 0 );&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; // redirect unbuffered STDERR to the console&lt;br&gt;
&amp;gt; lStdHandle =3D (long)GetStdHandle(STD_ERROR_HANDLE);&lt;br&gt;
&amp;gt; hConHandle =3D _open_osfhandle(lStdHandle, _O_TEXT);&lt;br&gt;
&amp;gt; fp =3D _fdopen( hConHandle, &quot;w&quot; );&lt;br&gt;
&amp;gt; *stderr =3D *fp;&lt;br&gt;
&amp;gt; setvbuf( stderr, NULL, _IONBF, 0 );&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog&lt;br&gt;
&amp;gt; // point to console as well&lt;br&gt;
&amp;gt; ios::sync_with_stdio();}&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; #endif&lt;br&gt;
&amp;gt; /* End of File */&lt;br&gt;
&lt;br&gt;
Bill, what do you with the console after the mexFunction returns? If I&lt;br&gt;
call the mex file again, the call to AllocConsole fails (&quot;access&lt;br&gt;
denied&quot; and no GetStdHandle) and no output to the existing console is&lt;br&gt;
possible, unfortunately, I don't understand why. So, I free the&lt;br&gt;
console first and allocate a new one. The questions is how to reuse&lt;br&gt;
the console between different mexFunction invocations?&lt;br&gt;
Igor</description>
    </item>
    <item>
      <pubDate>Thu, 09 Oct 2008 12:00:47 -0400</pubDate>
      <title>Re: C++ mex question</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235382#604309</link>
      <author>Bill August</author>
      <description>&amp;gt; On Sep 2, 10:25&#160;am, Bill August &amp;lt;hui.s...@beds.ac.uk&amp;gt;&lt;br&gt;
&amp;gt; wrote:&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; Hi,&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; I am using Matlab R2008a 64 bit and MSVC++ 9.0&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; (Visual&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; Studio 2008) on Windows Vista 64 bit. I compile&lt;br&gt;
&amp;gt; the&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; following mex function&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; #include &quot;mex.h&quot;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; #include &amp;lt;iostream&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; using namespace std;&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; extern &quot;C&quot;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; void mexFunction(int nlhs,mxArray *plhs[],int&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; nrhs,const&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; mxArray *prhs[])&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; {&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; &#160; &#160; cout &amp;lt;&amp;lt; &quot;Test&quot; &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; flush;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; &#160; &#160; //printf(&quot;Test\n&quot;);&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; }&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; The cout doesn't result in anything being&lt;br&gt;
&amp;gt; displayed.&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; Section 26 of the tech note&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt;&lt;a href=&quot;http://www.mathworks.com/support/tech-notes/1600/1605&quot;&gt;http://www.mathworks.com/support/tech-notes/1600/1605&lt;/a&gt;&lt;br&gt;
&amp;gt; .&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; html&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; does say &quot;Using cout will not work as expected in&lt;br&gt;
&amp;gt; C++&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; MEX-&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; files. This is because cout is expecting to use a&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; display&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; that is not MATLAB. To workaround this problem,&lt;br&gt;
&amp;gt; use&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; mexPrintf instead.&quot;. However,&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; 1. This mex function works with Matlab R14 and&lt;br&gt;
&amp;gt; MSVC++&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; 7.1&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; (Visual Studio 2003) on Windows XP.&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; 2. I am using some C++ template libraries that&lt;br&gt;
&amp;gt; use&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; cout. So&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; I cannot change them to mexPrintf.&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; 3. The commented printf call works. Aren't cout&lt;br&gt;
&amp;gt; and&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; printf&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; using the same output device?&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; Thank you for your help.&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; Siva&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; Hi Siva,&lt;br&gt;
&amp;gt; &amp;gt; My solution is to open a new console window for&lt;br&gt;
&amp;gt; cout. It may help you to solve the problem.&lt;br&gt;
&amp;gt; &amp;gt; Regards.&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; ------file coutdemo.cpp-----&lt;br&gt;
&amp;gt; &amp;gt; // Usage:&lt;br&gt;
&amp;gt; &amp;gt; // &#160; &#160; &#160; &#160;show how to open a console window for&lt;br&gt;
&amp;gt; matlab to handle cout message&lt;br&gt;
&amp;gt; &amp;gt; // Input:&lt;br&gt;
&amp;gt; &amp;gt; // &#160; &#160; &#160; &#160;none&lt;br&gt;
&amp;gt; &amp;gt; // Output:&lt;br&gt;
&amp;gt; &amp;gt; // &#160; &#160; &#160; &#160;none&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; #include &quot;mex.h&quot;&lt;br&gt;
&amp;gt; &amp;gt; #include &amp;lt;windows.h&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; #include &amp;lt;iostream&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; #include &quot;guicon.h&quot;&lt;br&gt;
&amp;gt; &amp;gt; using namespace std ;&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; void mexFunction(int nlhs, mxArray *phs[], int&lt;br&gt;
&amp;gt; nrhs, const mxArray *prhs[])&lt;br&gt;
&amp;gt; &amp;gt; {&lt;br&gt;
&amp;gt; &amp;gt; &#160; &#160; &#160; &#160; // redirect&lt;br&gt;
&amp;gt; &amp;gt; &#160; &#160; &#160; &#160; RedirectIOToConsole();&lt;br&gt;
&amp;gt; &amp;gt; &#160; &#160; &#160; &#160; // print&lt;br&gt;
&amp;gt; &amp;gt; &#160; &#160; &#160; &#160; cout&amp;lt;&amp;lt;&quot;cout demo&quot;&amp;lt;&amp;lt;endl;&lt;br&gt;
&amp;gt; &amp;gt; &#160; &#160; &#160; &#160; // wait for kill&lt;br&gt;
&amp;gt; &amp;gt; &#160; &#160; &#160; &#160; cin.get() ;&lt;br&gt;
&amp;gt; &amp;gt; &#160; &#160; &#160; &#160; // kill the console&lt;br&gt;
&amp;gt; &amp;gt; &#160; &#160; &#160; &#160; FreeConsole() ;&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; }&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; -----file guicon.h------&lt;br&gt;
&amp;gt; &amp;gt; #ifndef __GUICON_H__&lt;br&gt;
&amp;gt; &amp;gt; #define __GUICON_H__&lt;br&gt;
&amp;gt; &amp;gt; #ifdef _DEBUG&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; void RedirectIOToConsole();&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; #endif&lt;br&gt;
&amp;gt; &amp;gt; #endif&lt;br&gt;
&amp;gt; &amp;gt; /* End of File */&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; -----file guicon.cpp------&lt;br&gt;
&amp;gt; &amp;gt; #include &amp;lt;windows.h&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; #include &amp;lt;stdio.h&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; #include &amp;lt;fcntl.h&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; #include &amp;lt;io.h&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; #include &amp;lt;iostream&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; #include &amp;lt;fstream&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; #ifndef _USE_OLD_IOSTREAMS&lt;br&gt;
&amp;gt; &amp;gt; using namespace std;&lt;br&gt;
&amp;gt; &amp;gt; #endif&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; // maximum mumber of lines the output console&lt;br&gt;
&amp;gt; should have&lt;br&gt;
&amp;gt; &amp;gt; static const WORD MAX_CONSOLE_LINES = 500;&lt;br&gt;
&amp;gt; &amp;gt; #ifdef _DEBUG&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; void RedirectIOToConsole()&lt;br&gt;
&amp;gt; &amp;gt; {&lt;br&gt;
&amp;gt; &amp;gt; int hConHandle;&lt;br&gt;
&amp;gt; &amp;gt; long lStdHandle;&lt;br&gt;
&amp;gt; &amp;gt; CONSOLE_SCREEN_BUFFER_INFO coninfo;&lt;br&gt;
&amp;gt; &amp;gt; FILE *fp;&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; // allocate a console for this appAllocConsole();&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; // set the screen buffer to be big enough to let us&lt;br&gt;
&amp;gt; scroll text&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HAN&lt;br&gt;
&amp;gt; DLE), &amp;coninfo);&lt;br&gt;
&amp;gt; &amp;gt; coninfo.dwSize.Y = MAX_CONSOLE_LINES;&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HAN&lt;br&gt;
&amp;gt; DLE),&lt;br&gt;
&amp;gt; &amp;gt; coninfo.dwSize);&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; // redirect unbuffered STDOUT to the console&lt;br&gt;
&amp;gt; &amp;gt; lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);&lt;br&gt;
&amp;gt; &amp;gt; hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);&lt;br&gt;
&amp;gt; &amp;gt; fp = _fdopen( hConHandle, &quot;w&quot; );&lt;br&gt;
&amp;gt; &amp;gt; *stdout = *fp;&lt;br&gt;
&amp;gt; &amp;gt; setvbuf( stdout, NULL, _IONBF, 0 );&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; // redirect unbuffered STDIN to the console&lt;br&gt;
&amp;gt; &amp;gt; lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE);&lt;br&gt;
&amp;gt; &amp;gt; hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);&lt;br&gt;
&amp;gt; &amp;gt; fp = _fdopen( hConHandle, &quot;r&quot; );&lt;br&gt;
&amp;gt; &amp;gt; *stdin = *fp;&lt;br&gt;
&amp;gt; &amp;gt; setvbuf( stdin, NULL, _IONBF, 0 );&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; // redirect unbuffered STDERR to the console&lt;br&gt;
&amp;gt; &amp;gt; lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE);&lt;br&gt;
&amp;gt; &amp;gt; hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);&lt;br&gt;
&amp;gt; &amp;gt; fp = _fdopen( hConHandle, &quot;w&quot; );&lt;br&gt;
&amp;gt; &amp;gt; *stderr = *fp;&lt;br&gt;
&amp;gt; &amp;gt; setvbuf( stderr, NULL, _IONBF, 0 );&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; // make cout, wcout, cin, wcin, wcerr, cerr, wclog&lt;br&gt;
&amp;gt; and clog&lt;br&gt;
&amp;gt; &amp;gt; // point to console as well&lt;br&gt;
&amp;gt; &amp;gt; ios::sync_with_stdio();}&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; #endif&lt;br&gt;
&amp;gt; &amp;gt; /* End of File */&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Bill, what do you with the console after the&lt;br&gt;
&amp;gt; mexFunction returns? If I&lt;br&gt;
&amp;gt; call the mex file again, the call to AllocConsole&lt;br&gt;
&amp;gt; fails (&quot;access&lt;br&gt;
&amp;gt; denied&quot; and no GetStdHandle) and no output to the&lt;br&gt;
&amp;gt; existing console is&lt;br&gt;
&amp;gt; possible, unfortunately, I don't understand why. So,&lt;br&gt;
&amp;gt; I free the&lt;br&gt;
&amp;gt; console first and allocate a new one. The questions&lt;br&gt;
&amp;gt; is how to reuse&lt;br&gt;
&amp;gt; the console between different mexFunction&lt;br&gt;
&amp;gt; invocations?&lt;br&gt;
&amp;gt; Igor&lt;br&gt;
Hi Igor,&lt;br&gt;
It is quite easy to solve this probelm.&lt;br&gt;
The idea is to return the handles of the console.&lt;br&gt;
You can visit my blog for details.&lt;br&gt;
beljsl.blogspot.com&lt;br&gt;
Good luck.</description>
    </item>
    <item>
      <pubDate>Thu, 09 Oct 2008 13:53:20 -0400</pubDate>
      <title>Re: C++ mex question</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235382#604406</link>
      <author>Hui Song</author>
      <description>rych &amp;lt;rychphd@gmail.com&amp;gt; wrote in message &amp;lt;5b850fc6-660d-420f-ba1c-f417c29a3046@m45g2000hsb.googlegroups.com&amp;gt;...&lt;br&gt;
&amp;gt; On Sep 2, 10:25=A0am, Bill August &amp;lt;hui.s...@beds.ac.uk&amp;gt; wrote:&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; Hi,&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; I am using Matlab R2008a 64 bit and MSVC++ 9.0&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; (Visual&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; Studio 2008) on Windows Vista 64 bit. I compile the&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; following mex function&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; #include &quot;mex.h&quot;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; #include &amp;lt;iostream&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; using namespace std;&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; extern &quot;C&quot;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; void mexFunction(int nlhs,mxArray *plhs[],int&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; nrhs,const&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; mxArray *prhs[])&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; {&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; =A0 =A0 cout &amp;lt;&amp;lt; &quot;Test&quot; &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; flush;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; =A0 =A0 //printf(&quot;Test\n&quot;);&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; }&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; The cout doesn't result in anything being displayed.&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; Section 26 of the tech note&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt;&lt;a href=&quot;http://www.mathworks.com/support/tech-notes/1600/1605.&quot;&gt;http://www.mathworks.com/support/tech-notes/1600/1605.&lt;/a&gt;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; html&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; does say &quot;Using cout will not work as expected in C++&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; MEX-&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; files. This is because cout is expecting to use a&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; display&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; that is not MATLAB. To workaround this problem, use&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; mexPrintf instead.&quot;. However,&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; 1. This mex function works with Matlab R14 and MSVC++&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; 7.1&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; (Visual Studio 2003) on Windows XP.&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; 2. I am using some C++ template libraries that use&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; cout. So&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; I cannot change them to mexPrintf.&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; 3. The commented printf call works. Aren't cout and&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; printf&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; using the same output device?&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; Thank you for your help.&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; Siva&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; Hi Siva,&lt;br&gt;
&amp;gt; &amp;gt; My solution is to open a new console window for cout. It may help you to =&lt;br&gt;
&amp;gt; solve the problem.&lt;br&gt;
&amp;gt; &amp;gt; Regards.&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; ------file coutdemo.cpp-----&lt;br&gt;
&amp;gt; &amp;gt; // Usage:&lt;br&gt;
&amp;gt; &amp;gt; // =A0 =A0 =A0 =A0show how to open a console window for matlab to handle =&lt;br&gt;
&amp;gt; cout message&lt;br&gt;
&amp;gt; &amp;gt; // Input:&lt;br&gt;
&amp;gt; &amp;gt; // =A0 =A0 =A0 =A0none&lt;br&gt;
&amp;gt; &amp;gt; // Output:&lt;br&gt;
&amp;gt; &amp;gt; // =A0 =A0 =A0 =A0none&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; #include &quot;mex.h&quot;&lt;br&gt;
&amp;gt; &amp;gt; #include &amp;lt;windows.h&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; #include &amp;lt;iostream&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; #include &quot;guicon.h&quot;&lt;br&gt;
&amp;gt; &amp;gt; using namespace std ;&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; void mexFunction(int nlhs, mxArray *phs[], int nrhs, const mxArray *prhs[=&lt;br&gt;
&amp;gt; ])&lt;br&gt;
&amp;gt; &amp;gt; {&lt;br&gt;
&amp;gt; &amp;gt; =A0 =A0 =A0 =A0 // redirect&lt;br&gt;
&amp;gt; &amp;gt; =A0 =A0 =A0 =A0 RedirectIOToConsole();&lt;br&gt;
&amp;gt; &amp;gt; =A0 =A0 =A0 =A0 // print&lt;br&gt;
&amp;gt; &amp;gt; =A0 =A0 =A0 =A0 cout&amp;lt;&amp;lt;&quot;cout demo&quot;&amp;lt;&amp;lt;endl;&lt;br&gt;
&amp;gt; &amp;gt; =A0 =A0 =A0 =A0 // wait for kill&lt;br&gt;
&amp;gt; &amp;gt; =A0 =A0 =A0 =A0 cin.get() ;&lt;br&gt;
&amp;gt; &amp;gt; =A0 =A0 =A0 =A0 // kill the console&lt;br&gt;
&amp;gt; &amp;gt; =A0 =A0 =A0 =A0 FreeConsole() ;&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; }&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; -----file guicon.h------&lt;br&gt;
&amp;gt; &amp;gt; #ifndef __GUICON_H__&lt;br&gt;
&amp;gt; &amp;gt; #define __GUICON_H__&lt;br&gt;
&amp;gt; &amp;gt; #ifdef _DEBUG&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; void RedirectIOToConsole();&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; #endif&lt;br&gt;
&amp;gt; &amp;gt; #endif&lt;br&gt;
&amp;gt; &amp;gt; /* End of File */&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; -----file guicon.cpp------&lt;br&gt;
&amp;gt; &amp;gt; #include &amp;lt;windows.h&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; #include &amp;lt;stdio.h&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; #include &amp;lt;fcntl.h&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; #include &amp;lt;io.h&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; #include &amp;lt;iostream&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; #include &amp;lt;fstream&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; #ifndef _USE_OLD_IOSTREAMS&lt;br&gt;
&amp;gt; &amp;gt; using namespace std;&lt;br&gt;
&amp;gt; &amp;gt; #endif&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; // maximum mumber of lines the output console should have&lt;br&gt;
&amp;gt; &amp;gt; static const WORD MAX_CONSOLE_LINES =3D 500;&lt;br&gt;
&amp;gt; &amp;gt; #ifdef _DEBUG&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; void RedirectIOToConsole()&lt;br&gt;
&amp;gt; &amp;gt; {&lt;br&gt;
&amp;gt; &amp;gt; int hConHandle;&lt;br&gt;
&amp;gt; &amp;gt; long lStdHandle;&lt;br&gt;
&amp;gt; &amp;gt; CONSOLE_SCREEN_BUFFER_INFO coninfo;&lt;br&gt;
&amp;gt; &amp;gt; FILE *fp;&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; // allocate a console for this appAllocConsole();&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; // set the screen buffer to be big enough to let us scroll text&lt;br&gt;
&amp;gt; &amp;gt; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &amp;coninfo);&lt;br&gt;
&amp;gt; &amp;gt; coninfo.dwSize.Y =3D MAX_CONSOLE_LINES;&lt;br&gt;
&amp;gt; &amp;gt; SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE),&lt;br&gt;
&amp;gt; &amp;gt; coninfo.dwSize);&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; // redirect unbuffered STDOUT to the console&lt;br&gt;
&amp;gt; &amp;gt; lStdHandle =3D (long)GetStdHandle(STD_OUTPUT_HANDLE);&lt;br&gt;
&amp;gt; &amp;gt; hConHandle =3D _open_osfhandle(lStdHandle, _O_TEXT);&lt;br&gt;
&amp;gt; &amp;gt; fp =3D _fdopen( hConHandle, &quot;w&quot; );&lt;br&gt;
&amp;gt; &amp;gt; *stdout =3D *fp;&lt;br&gt;
&amp;gt; &amp;gt; setvbuf( stdout, NULL, _IONBF, 0 );&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; // redirect unbuffered STDIN to the console&lt;br&gt;
&amp;gt; &amp;gt; lStdHandle =3D (long)GetStdHandle(STD_INPUT_HANDLE);&lt;br&gt;
&amp;gt; &amp;gt; hConHandle =3D _open_osfhandle(lStdHandle, _O_TEXT);&lt;br&gt;
&amp;gt; &amp;gt; fp =3D _fdopen( hConHandle, &quot;r&quot; );&lt;br&gt;
&amp;gt; &amp;gt; *stdin =3D *fp;&lt;br&gt;
&amp;gt; &amp;gt; setvbuf( stdin, NULL, _IONBF, 0 );&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; // redirect unbuffered STDERR to the console&lt;br&gt;
&amp;gt; &amp;gt; lStdHandle =3D (long)GetStdHandle(STD_ERROR_HANDLE);&lt;br&gt;
&amp;gt; &amp;gt; hConHandle =3D _open_osfhandle(lStdHandle, _O_TEXT);&lt;br&gt;
&amp;gt; &amp;gt; fp =3D _fdopen( hConHandle, &quot;w&quot; );&lt;br&gt;
&amp;gt; &amp;gt; *stderr =3D *fp;&lt;br&gt;
&amp;gt; &amp;gt; setvbuf( stderr, NULL, _IONBF, 0 );&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog&lt;br&gt;
&amp;gt; &amp;gt; // point to console as well&lt;br&gt;
&amp;gt; &amp;gt; ios::sync_with_stdio();}&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; #endif&lt;br&gt;
&amp;gt; &amp;gt; /* End of File */&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Bill, what do you with the console after the mexFunction returns? If I&lt;br&gt;
&amp;gt; call the mex file again, the call to AllocConsole fails (&quot;access&lt;br&gt;
&amp;gt; denied&quot; and no GetStdHandle) and no output to the existing console is&lt;br&gt;
&amp;gt; possible, unfortunately, I don't understand why. So, I free the&lt;br&gt;
&amp;gt; console first and allocate a new one. The questions is how to reuse&lt;br&gt;
&amp;gt; the console between different mexFunction invocations?&lt;br&gt;
&amp;gt; Igor&lt;br&gt;
Hi Igor,&lt;br&gt;
The idea is quite easy. Just return the handles of the console so that when you can find it by the handls next time.&lt;br&gt;
For details you can visit my blog:&lt;br&gt;
beljsl.blogspot.com</description>
    </item>
  </channel>
</rss>

