s函数c++字符串参数

30视图(30天)
尼尔斯·Gerke
尼尔斯·Gerke 2018年8月13日
评论道: 提多Edelhofer 2018年8月31日
嘿,
我麻烦读字符串的值传递到MATLAB c++作为函数参数:
std:: string str (mxArrayToString (ssGetSFcnParam(年代,0)));
把以下异常:
计划:C: \ windows \ SYSTEM32系统\ MSVCP140D.dll
文件:C:\Program Files (x86)\Microsoft视觉Studio 14.0 \ VC \ \ xstring
线:1181
表情:无效的空指针
你的程序的信息可能会导致一个断言
失败,看到Visual c++文档断言。
(按重试调试应用程序)
MATLAB。exe已经引发了一个断点。
异常在MATLAB扔在0 x00007ffb6c9a0a63 (test.mexw64)。exe: 0 xc0000005:访问违例0 x0000000000000000阅读位置。
> throw_segv_longjmp_seh_filter ()
调用THROW_SEGV_LONGJMP throw_segv_longjmp_seh_filter ():医师过滤器
> throwSegvLongjmpFilter ()
MATLAB。exe已经引发了一个断点。
“[19672]MATLAB程序。exe”退出代码0 (0 x0)。
调试我分裂:
常量mxArray * pArrayValue = ssGetSFcnParam(年代,0);
常量char * pCharArray = mxArrayToString (pArrayValue);
std:: string str (pCharArray);
pCharArray指出:
0 x000000000000000
我用VS 14.0.25431.01更新3与Matlab 2018赢得10 Pro 17134.165。我发现代码在我们公司仓库,上面的代码片段,在MATLAB 2013 b,我做错了什么?这是语法无效的2018年吗?
编辑31.08.18:
我添加了一个例子:
#定义S_FUNCTION_LEVEL2
#定义S_FUNCTION_NAMEsfun_pass_string
#包括“simstruc.h”
#包括<字符串>
静态空白mdlInitializeSizes (SimStruct *年代)
{
ssSetNumSFcnParams (S, 1);
ssSetSFcnParamTunable(年代,0,SS_PRM_NOT_TUNABLE);
如果(ssGetNumSFcnParams ! = ssGetSFcnParamsCount (S)) {
返回;
}
如果(! ssSetNumInputPorts(年代,1))返回;
ssSetInputPortWidth(年代,0,DYNAMICALLY_SIZED);
ssSetInputPortDirectFeedThrough (0, 1);
如果(! ssSetNumOutputPorts(年代,1))返回;
ssSetOutputPortWidth(年代,0,DYNAMICALLY_SIZED);
ssSetNumSampleTimes (S, 1);
ssSetOptions(年代,SS_OPTION_CALL_TERMINATE_ON_EXIT);
}
静态空白mdlInitializeSampleTimes (SimStruct *年代)
{
ssSetSampleTime(年代,0,INHERITED_SAMPLE_TIME);
ssSetOffsetTime(年代,0,0.0);
ssSetModelReferenceSampleTimeDefaultInheritance(年代);
}
#定义MDL_START
静态空白mdlStart (SimStruct *年代)
{
mexPrintf (“类参数:% s”mxGetClassName (ssGetSFcnParam(年代,0)));
const mxArray * pArrayValue = ssGetSFcnParam (S, 0);
const char * pCharArray = mxArrayToString (pArrayValue);
std:: string string_1 (pCharArray);
mexPrintf (string_1.c_str ());
}
静态空白mdlOutputs (SimStruct * S, int_T tid)
{
}
静态空白mdlTerminate (SimStruct *年代)
{
}
#如果定义了MATLAB_MEX_FILE/ *这是文件被编译为一个MEX-file吗?* /
#包括“金宝appsimulink.c”/ * MEX-file接口机制* /
#其他的
#包括“cg_sfun.h”/ *代码生成注册函数* /
#endif
3评论
提多Edelhofer
提多Edelhofer 2018年8月30日
尼尔斯,
mxArray测试=
将不会工作,因为你总是必须使用指针…
提图斯

登录置评。

接受的答案

提多Edelhofer
提多Edelhofer 2018年8月31日
嗨,尼尔斯,
我没有看一看在zip文件但有没有可能你做我犯同样的错误,即真正传递一个字符串(“hello”)的s函数而不是char数组(“你好”)?如果我使用string类,然后我看到同样的问题。当通过一个老式char数组,然后一切都按预期工作。
提图斯
3评论
提多Edelhofer
提多Edelhofer 2018年8月31日
“是”和“不是”:是的,致命的异常的确是“不受欢迎”:)。是的:就好了如果函数不仅还接受字符串和字符数组。现在没有:这是C的世界,(不幸的)用户责任检查返回值。
空指针的进一步处理,使例外。医生你会看到:
返回 c风格的字符串。失败返回NULL。可能的原因包括内存不足和失败 指定的数组不是mxCHAR数组
提图斯

登录置评。

答案(1)

提多Edelhofer
提多Edelhofer 2018年8月30日
嗨,尼尔斯,
可以肯定的是:你是否检查参数的数量了吗?我猜你确信至少有一个参数,但可能有助于检查,否则看起来很好。试一试
intnParam = ssGetSFcnParamsCount (S);
mexPrintf (“参数的数量:% d \ n”,nParam);
提图斯
5个评论
尼尔斯·Gerke
尼尔斯·Gerke 2018年8月31日
我添加了一个复制的例子,请参阅代码和后段1 . zip

登录置评。

下载188bet金宝搏


释放

R2018a

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!