Return 个值从 C++ MEX 文件到 MATLAB
Return values from a C++ MEX file to MATLAB
我正在编写一个从 C++ 代码检索数据的 MATLAB 程序。为此,我在 MATLAB 中创建了一个 MEX 文件和一个网关 mexFunction。
尽管可以在 MATLAB 中读取读取值,但我无法检索它来使用它。如果不清楚,我会遇到与此处完全相同的问题 (How to return a float value from a mex function, and how to retrieve it from m-file?),但我想检索由我的 C++ 程序显示的值。
这是我的 C++ 代码:
#define _AFXDLL
#define _tprintf mexPrintf
#include "StdAfx.h"
#include "704IO.h"
#include "Test704.h"
#include "mex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
/////////////////////////////////////////////////////////////////////////////
CWinApp theApp; // The one and only application object
/////////////////////////////////////////////////////////////////////////////
using namespace std;
/////////////////////////////////////////////////////////////////////////////
int _tmain(int argc, TCHAR *argv[], TCHAR *envp[])
//void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
HMODULE hModule(::GetModuleHandle(NULL));
short valueRead;
if (hModule != NULL)
{
// Initialize MFC and print and error on failure
if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
{
//mexPrintf("Fatal Error: MFC initialization failed");
//nRetCode = 1;
}
else
{
valueRead = PortRead(1, 780, -1);
mexPrintf("Value Read = %i\n",valueRead);
}
}
else
{
_tprintf(_T("Fatal Error: GetModuleHandle failed\n"));
}
//return nRetCode;
}
/////////////////////////////////////////////////////////////////////////////
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
_tmain(0,0,0);
return;
}
如果您需要有关我的问题的更多信息,请告诉我?
要 return 一个整数到 Matlab,您可以按照您发布的 link 的说明进行操作,但稍微修改一下,以便 return 编辑整数。
void mexFunction(int nlhs, mxArray * plhs[], int nrhs, const mxArray * prhs[])
{
// Create a 1-by-1 real integer.
// Integer classes are mxINT32_CLASS, mxINT16_CLASS, mxINT8_CLASS
// depending on what you want.
plhs[0] = mxCreateNumericMatrix(1, 1, mxINT16_CLASS, mxREAL);
// fill in plhs[0] to contain the same as whatever you want
// remember that you may want to change your variabel class here depending on your above flag to *short int* or something else.
int* data = (int*) mxGetData(plhs[0]);
// This asigns data the same memory address as plhs[0]. the return value
data[0]=_tmain(0,0,0); //or data[0]=anyFunctionThatReturnsInt();
return;
}
我正在编写一个从 C++ 代码检索数据的 MATLAB 程序。为此,我在 MATLAB 中创建了一个 MEX 文件和一个网关 mexFunction。 尽管可以在 MATLAB 中读取读取值,但我无法检索它来使用它。如果不清楚,我会遇到与此处完全相同的问题 (How to return a float value from a mex function, and how to retrieve it from m-file?),但我想检索由我的 C++ 程序显示的值。 这是我的 C++ 代码:
#define _AFXDLL
#define _tprintf mexPrintf
#include "StdAfx.h"
#include "704IO.h"
#include "Test704.h"
#include "mex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
/////////////////////////////////////////////////////////////////////////////
CWinApp theApp; // The one and only application object
/////////////////////////////////////////////////////////////////////////////
using namespace std;
/////////////////////////////////////////////////////////////////////////////
int _tmain(int argc, TCHAR *argv[], TCHAR *envp[])
//void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
HMODULE hModule(::GetModuleHandle(NULL));
short valueRead;
if (hModule != NULL)
{
// Initialize MFC and print and error on failure
if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
{
//mexPrintf("Fatal Error: MFC initialization failed");
//nRetCode = 1;
}
else
{
valueRead = PortRead(1, 780, -1);
mexPrintf("Value Read = %i\n",valueRead);
}
}
else
{
_tprintf(_T("Fatal Error: GetModuleHandle failed\n"));
}
//return nRetCode;
}
/////////////////////////////////////////////////////////////////////////////
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
_tmain(0,0,0);
return;
}
如果您需要有关我的问题的更多信息,请告诉我?
要 return 一个整数到 Matlab,您可以按照您发布的 link 的说明进行操作,但稍微修改一下,以便 return 编辑整数。
void mexFunction(int nlhs, mxArray * plhs[], int nrhs, const mxArray * prhs[])
{
// Create a 1-by-1 real integer.
// Integer classes are mxINT32_CLASS, mxINT16_CLASS, mxINT8_CLASS
// depending on what you want.
plhs[0] = mxCreateNumericMatrix(1, 1, mxINT16_CLASS, mxREAL);
// fill in plhs[0] to contain the same as whatever you want
// remember that you may want to change your variabel class here depending on your above flag to *short int* or something else.
int* data = (int*) mxGetData(plhs[0]);
// This asigns data the same memory address as plhs[0]. the return value
data[0]=_tmain(0,0,0); //or data[0]=anyFunctionThatReturnsInt();
return;
}