我在MATLAB中编写程序,我必须调用C ++库。为此,我创建了一个C ++文件,该文件调用库,然后创建一个MEX文件,帮助我在MATLAB中调用所需的函数。 我想在库中访问的函数返回一个值,但我必须给它参数。我目前能够检索一个值,因为我直接在C ++代码中编写参数,你可以在这里看到(我的文件名是Test704()):
// Test704.cpp : Defines the entry point for the console application.
#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[])
int _tmain(double port[], double rack[], double offset[])
{
//HMODULE hModule(::GetModuleHandle(NULL));
double valueRead;
//short port;
//short rack;
//short offset;
//if (hModule != NULL)
//{
// // Initialize MFC and print and error on failure
// if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
// {
// _tprintf(_T("Fatal Error: MFC initialization failed\n"));
// }
// else
// {
// //while(true)
// //{
// valueRead = PortRead(1, 780, -1);
valueRead = PortRead(port[0], rack[0], offset[0]);
mexPrintf("Value Read = %i\n",valueRead);
// //Sleep(1); // Sleep for 1s so we can see the value on the screen
// //}
// }
//}
//else
//{
// _tprintf(_T("Fatal Error: GetModuleHandle failed\n"));
//}
return valueRead;
}
/////////////////////////////////////////////////////////////////////////////
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
double *port, *rack, *offset;
// Creates a 1-by-1 real integer.
//plhs[0] = mxCreateNumericMatrix(1, 1, mxINT32_CLASS, mxREAL);
plhs[0] = mxCreateNumericMatrix(1, 1, mxINT32_CLASS, mxREAL);
int* data = (int*) mxGetData(plhs[0]);
port = mxGetPr(prhs[0]);
rack = mxGetPr(prhs[0]);
offset = mxGetPr(prhs[0]);
//valueRead = mxGetPr(plhs[0]);
//data[0]=_tmain(0,0,0);
//return ;
data[0] = _tmain(port,rack,offset);
}
您会注意到我已经评论了部分代码以进行研究。实际上,我现在希望能够通过这种方式给出参数(MATLAB代码):
x = 1;
y = 780;
z = 1;
myVal = double(Test704(x,y,z));
并且仍然可以在myVal中检索值。我帮助自己学习了MathWorks提供的示例timestwo.c,但不幸的是,它没有用,我不知道为什么......
答案 0 :(得分:2)
使用int nrhs, const mxArray *prhs[]
根据参数的类型,您需要使用不同的功能。例如,如果第一个参数是double,则可以检索:
double p = mxGetScalar(prhs[0]);