【问题标题】:Matlab eventually crashes with mex callbackMatlab 最终因 mex 回调而崩溃
【发布时间】:2018-05-15 09:23:13
【问题描述】:

我有一个 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
    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);
    }

【问题讨论】:

  • 一般来说,C 中的运行时异常会导致 MATLAB mex 崩溃。例如,非法读取。
  • 在这种情况下非法读取会是什么?
  • 越界、未初始化等。任何确实会产生运行时错误的东西。

标签: c matlab crash mex


【解决方案1】:

void (*cbPtr)() = NULL;
cbPtr = fruit_mexCallback;
Register_Callback(cbPtr);

fruit_mexCallback 类型不是void(*)() 它是void(*)(char *message, double message_type) 所以当它被称为void(*)() 参数可以有任何值并且不能使用

【讨论】:

  • 你指的是 'void (*cbPtr)() = NULL',它应该是 void (*cbPtr)(char *message, double message_type) = NULLl 吗?函数最终会崩溃不是很奇怪吗?这听起来更像是一个根本不会运行脚本的错误......
  • @DaanvS 这并不奇怪,参数将具有随机值,并且您有一个先决条件检查将返回 NULL,但指针可能是错误的而不是 null
  • 我也不知道 Register_Callback 的原型以及它是如何使用它的回调的,所以我只能说我认为很奇怪的地方
  • 不幸的是没有运气:(
  • 您有关于 Register_Callback 的文档
猜你喜欢
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
相关资源
最近更新 更多