MATLAB MEX 文件构建成功但未显示任何内容
MATLAB MEX-file builds successfully but nothing is displayed
我是新来的,所以我会尽量清楚地揭露我的问题:
我目前正在用 MATLAB 语言开发一个程序,该程序必须加载一个库才能正常工作。但是,后者是用 C/C++ 编写的(我无法访问它),但我可以用 C++ 调用它,然后创建一个 MEX 文件以使用返回值。
使用 Visual Studio 2012,我成功地调用了库(当我给它参数值作为参数时,portRead 函数 returns 给我一个值)。这是我的代码:
// Test704.cpp : Defines the entry point for the console application.
#define _AFXDLL
#define _tprintf mexPrintf
//#include "afx.h"
#include "StdAfx.h"
#include "704IO.h"
#include "Test704.h"
//#include "mat.h"
#include "mex.h"
//mxArray *matGetNextVariable(MATFile *mfp, const char **name);
#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[])
{
//int nRetCode(0);
HMODULE hModule(::GetModuleHandle(NULL));
short valueRead;
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"));
//mexPrintf("Fatal Error: MFC initialization failed");
//nRetCode = 1;
}
else
{
while(true)
{
valueRead = PortRead(1, 780, -1);
_tprintf(_T("Value Read = %i\n"), valueRead);
//mexPrintf("Value Read = %i",valueRead);
Sleep(1000); // Sleep for 1s so we can see the value on the screen
}
}
}
else
{
_tprintf(_T("Fatal Error: GetModuleHandle failed\n"));
//mexPrintf("Fatal Error: GetModuleHandle failed");
// nRetCode = 1;
}
//return nRetCode;
}
/////////////////////////////////////////////////////////////////////////////
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
int _tmain();
//short valueRead;
//valueRead = PortRead(1, 780, -1);
//_tprintf(_T("Value Read = %i\n"), valueRead);
//mexPrintf("Value Read = %i",valueRead);
return;
}
你可以看到我评论了我不成功的研究来解决我的问题...
此代码 returns me "valueRead = 255" 在控制台中,这意味着该程序运行良好。我现在想要的是在 MATLAB 中检索这个值。您可能还会注意到我创建了一个 mexFunction;事实上,我读到文档说必须在 C++ 中创建通向 MATLAB (=the mexFunction) 的网关。
现在,我使用 MATLAB R2015a 创建了以下 MEX 文件:
function test()
location = 'C:\Users\admin\Documents\MATLAB\';
mylib = [location '704IO.lib'];
mex( 'Test704.cpp', mylib)
我没有检索 "valueRead",而是收到一条指示
的消息
>Building with 'Microsoft Visual C++ 2012'. MEX completed successfully
所以,总而言之,我有功能性 C++ 代码,但我不明白为什么我无法将它 link 到 MATLAB 以便使用它!几天来我一直在寻找解决方案,我想是时候寻求帮助了:)
非常感谢您的帮助!
(P.-S.:我是 C++ 的初学者,对于 misunderstanding/bad 语法很抱歉)
通过调用
mex( 'Test704.cpp', mylib)
您只编译 .cpp
文件。结果,MATLAB 告诉您 MEX completed successfully
,这意味着编译成功了。因此,您将在工作目录中看到一个新文件:根据您的 OS,它可能被称为例如Test704.mexw64
(Windows,64 位)或类似的名称。每次更改 C++ 代码时都需要调用 mex
,因此文件会重新编译。
编译后的 file/function 现在可以像普通的 MATLAB 函数一样使用。要在没有任何其他参数的情况下调用它,只需键入
Test704()
在 MATLAB 中。这样,mexFunction()
就会被执行,这样你的 _tmain()
就会 运行。
注意: 您的 C++ 代码会将 valueRead = 255
写入 MATLAB 命令 window,但它 不会 在 MATLAB 中创建一个名为 valueRead
的变量。要创建这样一个变量,您必须 return 从 _tmain
读取值到 mexFunction
,并在那里分配一个 MATLAB 变量。
编辑:
你在 mexFunction
中有一个错误:你在那里写:
int _tmain();
这不是一个函数调用,而是一个函数声明。您告诉 C++
您有一个名为 _tmain()
的函数,但它从未被调用过。您需要的是一个函数调用,即只有 _tmain()
而没有 int
。请记住,您需要提供参数 int argc, TCHAR *argv[], TCHAR *envp[]
。我只是在这里将它们设置为零:
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
_tmain(0,0,0);
return;
}
我是新来的,所以我会尽量清楚地揭露我的问题: 我目前正在用 MATLAB 语言开发一个程序,该程序必须加载一个库才能正常工作。但是,后者是用 C/C++ 编写的(我无法访问它),但我可以用 C++ 调用它,然后创建一个 MEX 文件以使用返回值。 使用 Visual Studio 2012,我成功地调用了库(当我给它参数值作为参数时,portRead 函数 returns 给我一个值)。这是我的代码:
// Test704.cpp : Defines the entry point for the console application.
#define _AFXDLL
#define _tprintf mexPrintf
//#include "afx.h"
#include "StdAfx.h"
#include "704IO.h"
#include "Test704.h"
//#include "mat.h"
#include "mex.h"
//mxArray *matGetNextVariable(MATFile *mfp, const char **name);
#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[])
{
//int nRetCode(0);
HMODULE hModule(::GetModuleHandle(NULL));
short valueRead;
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"));
//mexPrintf("Fatal Error: MFC initialization failed");
//nRetCode = 1;
}
else
{
while(true)
{
valueRead = PortRead(1, 780, -1);
_tprintf(_T("Value Read = %i\n"), valueRead);
//mexPrintf("Value Read = %i",valueRead);
Sleep(1000); // Sleep for 1s so we can see the value on the screen
}
}
}
else
{
_tprintf(_T("Fatal Error: GetModuleHandle failed\n"));
//mexPrintf("Fatal Error: GetModuleHandle failed");
// nRetCode = 1;
}
//return nRetCode;
}
/////////////////////////////////////////////////////////////////////////////
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
int _tmain();
//short valueRead;
//valueRead = PortRead(1, 780, -1);
//_tprintf(_T("Value Read = %i\n"), valueRead);
//mexPrintf("Value Read = %i",valueRead);
return;
}
你可以看到我评论了我不成功的研究来解决我的问题... 此代码 returns me "valueRead = 255" 在控制台中,这意味着该程序运行良好。我现在想要的是在 MATLAB 中检索这个值。您可能还会注意到我创建了一个 mexFunction;事实上,我读到文档说必须在 C++ 中创建通向 MATLAB (=the mexFunction) 的网关。
现在,我使用 MATLAB R2015a 创建了以下 MEX 文件:
function test()
location = 'C:\Users\admin\Documents\MATLAB\';
mylib = [location '704IO.lib'];
mex( 'Test704.cpp', mylib)
我没有检索 "valueRead",而是收到一条指示
的消息>Building with 'Microsoft Visual C++ 2012'. MEX completed successfully
所以,总而言之,我有功能性 C++ 代码,但我不明白为什么我无法将它 link 到 MATLAB 以便使用它!几天来我一直在寻找解决方案,我想是时候寻求帮助了:)
非常感谢您的帮助! (P.-S.:我是 C++ 的初学者,对于 misunderstanding/bad 语法很抱歉)
通过调用
mex( 'Test704.cpp', mylib)
您只编译 .cpp
文件。结果,MATLAB 告诉您 MEX completed successfully
,这意味着编译成功了。因此,您将在工作目录中看到一个新文件:根据您的 OS,它可能被称为例如Test704.mexw64
(Windows,64 位)或类似的名称。每次更改 C++ 代码时都需要调用 mex
,因此文件会重新编译。
编译后的 file/function 现在可以像普通的 MATLAB 函数一样使用。要在没有任何其他参数的情况下调用它,只需键入
Test704()
在 MATLAB 中。这样,mexFunction()
就会被执行,这样你的 _tmain()
就会 运行。
注意: 您的 C++ 代码会将 valueRead = 255
写入 MATLAB 命令 window,但它 不会 在 MATLAB 中创建一个名为 valueRead
的变量。要创建这样一个变量,您必须 return 从 _tmain
读取值到 mexFunction
,并在那里分配一个 MATLAB 变量。
编辑:
你在 mexFunction
中有一个错误:你在那里写:
int _tmain();
这不是一个函数调用,而是一个函数声明。您告诉 C++
您有一个名为 _tmain()
的函数,但它从未被调用过。您需要的是一个函数调用,即只有 _tmain()
而没有 int
。请记住,您需要提供参数 int argc, TCHAR *argv[], TCHAR *envp[]
。我只是在这里将它们设置为零:
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
_tmain(0,0,0);
return;
}