S-Function String Parameter C++
Show older comments
Hey,
I've trouble reading the value of a string passed to MATLAB as an S-Function parameter in C++:
std::string str(mxArrayToString(ssGetSFcnParam(S,0)));
Throws the following exception:
Program: C:\windows\SYSTEM32\MSVCP140D.dll
File: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\xstring
Line: 1181
Expression: invalid null pointer
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
MATLAB.exe has triggered a breakpoint.
Exception thrown at 0x00007FFB6C9A0A63 (test.mexw64) in MATLAB.exe: 0xC0000005: Access violation reading location 0x0000000000000000.
> throw_segv_longjmp_seh_filter()
throw_segv_longjmp_seh_filter(): invoking THROW_SEGV_LONGJMP SEH filter
> throwSegvLongjmpFilter()
MATLAB.exe has triggered a breakpoint.
The program '[19672] MATLAB.exe' has exited with code 0 (0x0).
For debugging purposes I splitted it up:
const mxArray* pArrayValue = ssGetSFcnParam(S,0);
const char* pCharArray = mxArrayToString(pArrayValue);
std::string str(pCharArray);
pCharArray points to:
0x000000000000000
I am using VS 14.0.25431.01 Update 3 on Win 10 Pro 17134.165 with Matlab 2018a. I found code in our companies repository where both of the above code snippets are working, in MATLAB 2013b, what am I doing wrong? Is this syntax invalid in 2018a?
Edit 31.08.18:
I added an example:
#define S_FUNCTION_LEVEL 2
#define S_FUNCTION_NAME sfun_pass_string
#include "simstruc.h"
#include <string>
static void mdlInitializeSizes(SimStruct *S)
{
ssSetNumSFcnParams(S, 1);
ssSetSFcnParamTunable(S, 0, SS_PRM_NOT_TUNABLE);
if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
return;
}
if (!ssSetNumInputPorts(S,1)) return;
ssSetInputPortWidth(S, 0, DYNAMICALLY_SIZED);
ssSetInputPortDirectFeedThrough(S, 0, 1);
if (!ssSetNumOutputPorts(S, 1)) return;
ssSetOutputPortWidth(S, 0, DYNAMICALLY_SIZED);
ssSetNumSampleTimes(S, 1);
ssSetOptions(S, SS_OPTION_CALL_TERMINATE_ON_EXIT);
}
static void mdlInitializeSampleTimes(SimStruct *S)
{
ssSetSampleTime(S, 0, INHERITED_SAMPLE_TIME);
ssSetOffsetTime(S, 0, 0.0);
ssSetModelReferenceSampleTimeDefaultInheritance(S);
}
#define MDL_START
static void mdlStart(SimStruct *S)
{
mexPrintf("class of parameter: %s", mxGetClassName(ssGetSFcnParam(S,0)));
const mxArray* pArrayValue = ssGetSFcnParam(S,0);
const char* pCharArray = mxArrayToString(pArrayValue);
std::string string_1(pCharArray);
mexPrintf(string_1.c_str());
}
static void mdlOutputs(SimStruct *S, int_T tid)
{
}
static void mdlTerminate(SimStruct *S)
{
}
#ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */
#include "simulink.c" /* MEX-file interface mechanism */
#else
#include "cg_sfun.h" /* Code generation registration function */
#endif
3 Comments
James Tursa
on 30 Aug 2018
Edited: James Tursa
on 30 Aug 2018
The obvious question is, what class of mxArray is pArrayValue? Do you even know if it is of class char?
Nils Gerke
on 30 Aug 2018
Titus Edelhofer
on 30 Aug 2018
Nils,
mxArray test = ...
will not work, since you always have to use pointers ...
Titus
Accepted Answer
More Answers (1)
Titus Edelhofer
on 30 Aug 2018
Hi Nils,
just to be sure: did you check the number of parameters you passed? I guess you are sure that there is at least one parameter, but may helps to check, because otherwise it looks fine. Try
int nParam = ssGetSFcnParamsCount(S);
mexPrintf("Number of parameters: %d\n", nParam);
Titus
5 Comments
Nils Gerke
on 31 Aug 2018
Titus Edelhofer
on 31 Aug 2018
And coming back to James comment: you are probably also sure, that you indeed pass a string? You could add
mexPrintf("class of parameter: %s\", mxGetClassName(ssGetSFcnParam(S,0)));
to verify.
Titus
Nils Gerke
on 31 Aug 2018
Titus Edelhofer
on 31 Aug 2018
O.K., then I guess we need to wait to see a reproducing example ...
Nils Gerke
on 31 Aug 2018
Categories
Find more on String in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!