C Matlab最终因mex回调而崩溃
我有一个Mex函数,它将特定的消息和消息类型(1,2,3)从C转发到Matlab函数'fruit_getpar.m'。此Matlab函数'fruit_getpar.m'从消息字符串中提取参数,并将其存储为变量。C消息是在随机实例中生成的。问题是:Matlab有时会在生成C消息时崩溃,尽管该消息的结构始终相同 有什么线索吗C Matlab最终因mex回调而崩溃,c,matlab,crash,mex,C,Matlab,Crash,Mex,我有一个Mex函数,它将特定的消息和消息类型(1,2,3)从C转发到Matlab函数'fruit_getpar.m'。此Matlab函数'fruit_getpar.m'从消息字符串中提取参数,并将其存储为变量。C消息是在随机实例中生成的。问题是:Matlab有时会在生成C消息时崩溃,尽管该消息的结构始终相同 有什么线索吗 #include "mex.h" #include "fruit_matlab.h" #include "string.h" // Callback function
#include "mex.h"
#include "fruit_matlab.h"
#include "string.h"
// Callback function
void fruit_mexCallback(char *message, double message_type){
mxArray *lhs[2];
char sType[5];
if (message == NULL || message_type <= 0)
return;
if (strstr(message, "apple") == NULL && strstr(message, "banana") == NULL && strstr(message, "orange") == NULL) {
itoa((int)message_type, sType, 10);
lhs[0] = mxCreateString(message);
lhs[1] = mxCreateString(sType);
mexCallMATLAB(0, NULL, 2, lhs, "fruit_getpar");
mxDestroyArray(lhs[0]);
mxDestroyArray(lhs[1]);
}
return;
}
// MEX Gateway
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){
//pointer to callback function
void (*cbPtr)() = NULL;
cbPtr = fruit_mexCallback;
Register_Callback(cbPtr);
}
#包括“mex.h”
#包括“fruit_matlab.h”
#包括“string.h”
//回调函数
无效水果返回(字符*消息,双消息类型){
mxArray*lhs[2];
炭黑[5];
如果(消息==NULL | |消息类型in
fruit\u mexCallback类型不是void(*)(
它是void(*)(char*message,double message\u type)
所以当它被称为void(*)(
参数可以有任何值并且不能使用您指的是“void(*cbPtr)(=NULL”,应该是void(*cbPtr)(char*message,double message\u type)=NULLl?函数最终崩溃不是很奇怪吗?这听起来更像是一个根本不会运行脚本的bug…@DaanvS这并不奇怪,参数将有随机值,并且你有一个先决条件检查,它将返回NULL,但指针可能错误,而不是NULL。我也不知道Register\u回调的原型它是如何使用回调的,所以我可以说我认为奇怪的事情不幸的是没有运气:(你有关于Register_callback的文档吗?)一般来说,C中的运行时异常会使MATLAB mex崩溃。例如,非法读取。在此上下文中,非法读取可能是什么?越界、未初始化等。任何真正导致运行时错误的内容。
void (*cbPtr)() = NULL;
cbPtr = fruit_mexCallback;
Register_Callback(cbPtr);